Fornax-Platform
Forum

 « Return to Thread: Problem

Re: Problem

by Patrik Nordwall :: Rate this Message:

Reply to Author | View in Thread

The problem is that in the hbm file <set is defined.

I looked in the code generation template and for manyToManyReference there is:
LET getCollectionType() == "bag" ? "bag" : "set" AS collection

I would guess that for many-to-many it doesn't make sense to use an ordered List. We should probably have a constraint error on this case.

Probably you would like a one-to-many instead. You do that by adding reference in Employee to OrgUnit and define opposite, i.e. make the association bidirectional.
If you don't want bidirectional, you can keep it as is but add the inverse keyword.
This is described in http://fornax.itemis.de/confluence/display/fornax/3.+Advanced+Tutorial+(CSC)#3.AdvancedTutorial(CSC)-Collections

/Patrik

PaloT wrote:
Hello,
in my project following error is raised. I don't know why Set is
expected because everywhere List is declared. I'm using 1.5. Any idea?

TNX

STACK TRACE:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to
java.util.Set
        at org.hibernate.type.SetType.wrap(SetType.java:39)
        at org.hibernate.event.def.WrapVisitor.processArrayOrNewCollection(WrapVisitor.java:84)
        at org.hibernate.event.def.WrapVisitor.processCollection(WrapVisitor.java:51)
        at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
        at org.hibernate.event.def.WrapVisitor.processValue(WrapVisitor.java:98)
        at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
        at org.hibernate.event.def.DefaultFlushEntityEventListener.wrapCollections(DefaultFlushEntityEventListener.java:192)
        at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:125)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
        at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:105)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:126)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.fornax.cartridges.sculptor.framework.errorhandling.ServiceContextStoreAdvice.invoke(ServiceContextStoreAdvice.java:39)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy9.save(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at sk.f4s.pic.web.server.ScServlet.handleRequest(ScServlet.java:348)

DESIGN:
                Entity OrgUnit {
                        scaffold
                        String name key length="30";
                        - @OrgUnitKind orgUnitKind nullable;
                        - @Employee boss nullable;
                        - List<@Employee> employee;
                        - @OrgUnit parent nullable;
                }

HBM.XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping
DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class name="sk.f4s.pic.org.domain.OrgUnit" table="ORGUNIT">
    <id name="id">
      <generator class="native"/>
    </id>
    <version name="version" type="java.lang.Long"/>
    <!-- <natural-id> There is a BUG HHH-1569 that prevents us from
using <natural-id> -->
    <property name="name" length="30" not-null="true" unique="true"/>
    <!-- </natural-id> -->
    <property name="createdDate" type="timestamp"/>
    <property name="createdBy" length="50"/>
    <property name="lastUpdated" type="timestamp"/>
    <property name="lastUpdatedBy" length="50"/>
    <many-to-one name="orgUnitKind" column="ORGUNITKIND"
class="sk.f4s.pic.org.domain.OrgUnitKind" cascade="all"/>
    <many-to-one name="boss" column="BOSS"
class="sk.f4s.pic.org.domain.Employee" cascade="all"/>
    <many-to-one name="parent" column="PARENT"
class="sk.f4s.pic.org.domain.OrgUnit" cascade="all"/>
    <set name="employee" table="EMPLOYEE_ORGUNIT" cascade="all">
      <key column="ORGUNIT"/>
      <many-to-many column="EMPLOYEE" class="sk.f4s.pic.org.domain.Employee"/>
    </set>
  </class>
</hibernate-mapping>


BASE:
public abstract class OrgUnitBase extends AbstractDomainObject
    implements Auditable {
    private Long id;
    private String name;
    private Date createdDate;
    private String createdBy;
    private Date lastUpdated;
    private String lastUpdatedBy;
    private Long version;
    private OrgUnitKind orgUnitKind;
    private Employee boss;
    private OrgUnit parent;
    private List<Employee> employee = new ArrayList<Employee>();

    protected OrgUnitBase() {
    }

    public OrgUnitBase(@Name("name")
    String name) {
        super();
        Validate.notNull(name);
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    /**
     * The id is not intended to be changed or assigned manually, but
     * for test purpose it is allowed to assign the id.
     */
    protected void setId(Long id) {
        if ((this.id != null) && !this.id.equals(id)) {
            throw new IllegalArgumentException(
                "Not allowed to change the id property.");
        }
        this.id = id;
    }

    public String getName() {
        return name;
    }

    @SuppressWarnings("unused")
    private void setName(String name) {
        if ((this.name != null) && !this.name.equals(name)) {
            throw new IllegalArgumentException(
                "Not allowed to change the name property.");
        }
        this.name = name;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public Date getLastUpdated() {
        return lastUpdated;
    }

    public void setLastUpdated(Date lastUpdated) {
        this.lastUpdated = lastUpdated;
    }

    public String getLastUpdatedBy() {
        return lastUpdatedBy;
    }

    public void setLastUpdatedBy(String lastUpdatedBy) {
        this.lastUpdatedBy = lastUpdatedBy;
    }

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public OrgUnitKind getOrgUnitKind() {
        return orgUnitKind;
    }

    public void setOrgUnitKind(OrgUnitKind orgUnitKind) {
        this.orgUnitKind = orgUnitKind;
    }

    public Employee getBoss() {
        return boss;
    }

    public void setBoss(Employee boss) {
        this.boss = boss;
    }

    public OrgUnit getParent() {
        return parent;
    }

    public void setParent(OrgUnit parent) {
        this.parent = parent;
    }

    public List<Employee> getEmployee() {
        return employee;
    }

    @SuppressWarnings("unused")
    private void setEmployee(List<Employee> employee) {
        this.employee = employee;
    }

    /**
     * This method is used by equals and hashCode.
     * @return {@link #getName}
     */
    public Object getKey() {
        return getName();
    }
}

------------------------------------------------------------------------------
_______________________________________________
Fornax-developer mailing list
Fornax-developer@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/fornax-developer

 « Return to Thread: Problem