Bugs item #663037, was opened at 2003-01-06 02:57
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=428708&aid=663037&group_id=40712

Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Nobody/Anonymous (nobody)
Assigned to: Nobody/Anonymous (nobody)
Summary: Interface Inheritance not seen at Runtime

Initial Comment:
Hi! 

Congratulations for Hibernate !

In our project, we are going to migrate from JDO to 
Hibernate !

I encounter only one little pb with the use of Java 
Interface in the mapping file, the hierachie of Interfaces 
is ignored by hibernate.

Example:

Java Interfaces :

<<<<
package interfaces;
public interface Reference {
    public abstract void setRef(String ref);
    public abstract String getRef();
}
>>>>

<<<<
package interfaces;
public interface Referenceable {
    public Reference getReference();  
    public void setReference(Reference reference);
}
>>>>

<<<<
package interfaces;
import java.util.Collection;

public interface Child extends Referenceable {
    public Collection getParents();
    public void setParents(Collection parents);
    
    public Collection getAncestors();
    public void setAncestors(Collection ancestors);
    
    public boolean addParent(Parent parent);
    public boolean removeParent(Parent parent);
    
    public boolean isChildOf(Parent parent);
    public boolean isDescendentOf(Parent ancestor);
}
>>>>

<<<<
package com.agrochannels.qxe;
import java.util.Collection;

public interface Parent extends Child {
    public Collection getChildren();
    public void setChildren(Collection children);
    
    public Collection getDescendents();
    public void setDescendents(Collection descendents);
    
    public boolean addChild(Child child);
    public boolean removeChild(Child child);    
    
    public boolean isParentOf(Child child);
    public boolean isAncestorOf(Child child);
}
>>>>

And We have Implementations:

<<<<
package implementation;

public class ReferenceImpl implements Reference, 
Serializable, UserType {
..
}
>>>>

<<<<
package implementation;

public abstract class ReferencedObjectImpl implements 
Referenceable, Serializable {
..
}
>>>>

<<<<
package implementation;

public class ChildImpl extends ReferencedObjectImpl 
implements Child {
..
}
>>>>

<<<
package implementation;

public class ParentImpl extends ChildImpl implements 
Parent {
..
}
>>>

And with this hibernate mapping file :

<<<<
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 1.1//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-
1.1.dtd">

<hibernate-mapping>

        <!-- interfaces.Referenceable root -->
        <class name="interfaces.Referenceable" 
table="Referenceable">

                <id name="reference" 
type="implementation.ReferenceImpl">
                        <generator 
class="assigned"/>
                </id>

                <discriminator/>

                <subclass 
name="implementation.ReferencedObjectImpl">
                </subclass>

                <subclass 
name="interfaces.Child">
                        
                        <bag role="parents"
                                 
table="parents"
                                 lazy="true"
                                 
cascade="all">
                                 <key 
column="child_ref"/>
                                 <many-to-
many class="interfaces.Parent" column="parent_ref"/>
                        </bag>  
                        
                        <bag role="ancestors"
                                 
table="ancestors"
                                 lazy="true"
                                 
cascade="all">
                                 <key 
column="child_ref"/>
                                 <many-to-
many class="interfaces.Parent" column="parent_ref"/>
                        </bag>  
                <subclass 
name="implementation.ChildImpl">
                        </subclass>
                        <subclass 
name="interfaces.Parent">                       
        
                                <bag 
role="children"
                                 
        table="parents"
                                 
        readonly="true"
                                 
        lazy="true"
                                 
        cascade="all">
                                 
        <key column="parent_ref"/>
                                 
        <many-to-many class="interfaces.Child" 
column="child_ref"/>
                                </bag>  

                                <bag 
role="descendents"
                                 
        table="ancestors"
                                 
        readonly="true"
                                 
        lazy="true"
                                 
        cascade="all">
                                 
        <key column="parent_ref"/>
                                 
        <many-to-many class="interfaces.Child" 
column="child_ref"/>
                                </bag>  
        
                                <subclass 
name="implementation.ParentImpl">
                                </subclass>
                        </subclass>     
                </subclass>
        </class>
</hibernate-mapping>
>>>>

I can export the schema with 
cirrus.hibernate.tools.SchemaExport but at Runtime
I get this exception :
     [java] cirrus.hibernate.PropertyNotFoundException: 
Could not find a getter
for reference in class interfaces.Child
     [java]     at 
cirrus.hibernate.helpers.ReflectHelper.getGetter
(ReflectHelpe
r.java:198)
     [java]     at 
cirrus.hibernate.helpers.ReflectHelper.setter
(ReflectHelper.j
ava:164)
     [java]     at 
cirrus.hibernate.helpers.ReflectHelper.getSetter
(ReflectHelpe
r.java:145)
     [java]     at 
cirrus.hibernate.persister.AbstractEntityPersister.<init>
(Abs
tractEntityPersister.java:487)
     [java]     at 
cirrus.hibernate.persister.EntityPersister.<init>
(EntityPersi
ster.java:641)
     [java]     at 
cirrus.hibernate.impl.SessionFactoryImpl.<init>
(SessionFactor
yImpl.java:192)
     [java]     at 
cirrus.hibernate.impl.DatastoreImpl.buildSessionFactory
(Datas
toreImpl.java:403)
     [java]     at 
cirrus.hibernate.impl.DatastoreImpl.buildSessionFactory
(Datas
toreImpl.java:392)

Or the getReference() method in Child is inherited from 
Referenceable !

I have a workaround :
When I add explicitly the necessary methods in Child 
and other Interfaces, it works.

I think that it seems only necessary to correct the 
method cirrus.hibernate.helpers.ReflectHelper.getGetter()
to deal with interfaces and their inheritance.

I hope It was clear (I could have provided a simplier 
example with 2 interfaces, my english is not very 
good...).

Thanks,

Frank


----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=428708&aid=663037&group_id=40712


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
hibernate-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/hibernate-devel

Reply via email to