0 Replies Latest reply on Feb 28, 2006 11:59 AM by aidan davis

    Map Relation key problem

    aidan davis Newbie

      I'm trying to get a Map relation to work with a referenced Key....i.e the Key is another entity bean:

      @Entity
      @Table (name="ship")
      @NamedQuery(name="ship.getAll", query="from Ship sh")
      public class Ship {
      
       .....
      
       @CollectionOfElements (fetch = FetchType.EAGER)
       @MapKey(name="nameid")
       public Map<AttributeName,Attribute> getAttributes() {
       if((attributes) == null) attributes = new HashMap<AttributeName,Attribute>();
       return attributes;
       }
      
       public void setAttributes(Map<AttributeName,Attribute> attributes) {
       this.attributes = attributes;
       }
      
       private int id;
       private Map<AttributeName,Attribute> attributes;
      
      }
      
      


      public class Attribute {
      
       @Id @GeneratedValue(strategy= GenerationType.AUTO)
       public int getId() {
       return id;
       }
      
       public void setId(int id) {
       this.id = id;
       }
      
       @ManyToOne (cascade = {CascadeType.ALL})
       public AttributeName getNameid() {
       return nameid;
       }
      
       public void setNameid(AttributeName nameid) {
       this.nameid = nameid;
       }
      
       public String getValue() {
       return value;
       }
      
       public void setValue(String value) {
       this.value = value;
       }
      
       @ManyToOne (cascade = {CascadeType.PERSIST})
       public Ship getShip(){
       return ship;
       }
      
       public void setShip(Ship ship) {
       this.ship = ship;
       }
      
       public long getStartdate() {
       return startdate;
       }
      
       public void setStartdate(long startdate) {
       this.startdate = startdate;
       }
      
       public long getEnddate() {
       return enddate;
       }
      
       public void setEnddate(long enddate) {
       this.enddate = enddate;
       }
      
       private Ship ship;
       private int id;
       private AttributeName nameid;
       private String value;
       private long startdate;
       private long enddate;
      
      }
      


      @Entity
      @Table (name="attributename")
      public class AttributeName {
      
       @Id @GeneratedValue(strategy= GenerationType.AUTO)
       public int getId() {
       return id;
       }
      
       public void setId(int id) {
       this.id = id;
       }
      
       //Name of the attribute
       public String getName() {
       return name;
       }
      
       public void setName(String name) {
       this.name = name;
       }
      
       @CollectionOfElements
       public Collection<Attribute> getAttr() {
       if((attr) == null) attr = new ArrayList<Attribute>();
       return attr;
       }
      
       public void setAttr(Collection<Attribute> attr) {
       this.attr = attr;
       }
      
       private Collection<Attribute> attr;
       private int id;
       private String name;
      
      }
      


      and I get the following exception on deploy:

      Caused by: org.hibernate.MappingException: Could not determine type for: com.sms.srs.entity.AttributeName, for columns: [org.hibernate.mapping.Formula( nameid_id )]
       at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266)
       at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253)
       at org.hibernate.mapping.IndexedCollection.validate(IndexedCollection.java:68)
       at org.hibernate.cfg.Configuration.validate(Configuration.java:988)
       at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1169)
       at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:414)
       at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:575)
       at org.hibernate.ejb.Ejb3Configuration.createContainerEntityManagerFactory(Ejb3Configuration.java:245)
       at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:108)
       at org.jboss.ejb3.entity.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:260)
      



      To clarify, a ship should have a map of attributename -> attribute
      The attributename class has to be used rather than a string so that key uniqueness is maintained (I tested it with String and it worked fine....it seems to be something to do with AttributeName).

      I don't see where I'm missing notion, help appreciated!!

      Thanks.