1 Reply Latest reply on Aug 31, 2007 12:01 PM by waynebaylor

    AnnotationException: xxx not mapped to a single property...

    ttrepper

      Hi all,

      i get the following AnnotationException, and i don´t know why?




      SQL:

      CREATE TABLE Party (
       PartyID BIGINT DEFAULT nextval('seq_PartyID') NOT NULL,
       DateAdded TIMESTAMP DEFAULT current_timestamp,
       ActiveUntil TIMESTAMP,
       CONSTRAINT PK_Party PRIMARY KEY (PartyID)
      );
      
      CREATE TABLE PartyIsPerson (
       PartyIDPerson BIGINT NOT NULL,
       Title CHARACTER VARYING(40),
       Forename CHARACTER VARYING(80) NOT NULL,
       Lastname CHARACTER VARYING(80) NOT NULL,
       Birthday DATE,
       Gender CHARACTER(1),
       MaritalStatus CHARACTER(1),
       CONSTRAINT PK_PartyIsPerson PRIMARY KEY (PartyIDPerson)
      );
      
      CREATE TABLE PersonHasStoredSearches (
       PartyIDPerson BIGINT NOT NULL,
       SequenceNumber SMALLINT NOT NULL,
       SearchName CHARACTER VARYING(100),
       SearchPattern CHARACTER VARYING(100) NOT NULL,
       Active BOOLEAN DEFAULT true,
       DateAdded TIMESTAMP DEFAULT current_timestamp,
       ActiveUntil TIMESTAMP,
       CONSTRAINT PK_PersonHasStoredSearches PRIMARY KEY (PartyIDPerson, SequenceNumber)
      );
      
      CREATE TABLE PersonHasStoredReminders (
       PartyIDPerson BIGINT NOT NULL,
       SequenceNumber SMALLINT NOT NULL,
       ReminderName CHARACTER VARYING(100),
       Schedule TIMESTAMP,
       Active BOOLEAN,
       DateAdded TIMESTAMP DEFAULT current_timestamp,
       ActiveUntil TIMESTAMP,
       CONSTRAINT PK_PersonHasStoredReminders PRIMARY KEY (PartyIDPerson, SequenceNumber)
      );
      
      CREATE TABLE SearchUsesReminder (
       PartyIDPersonReminder BIGINT NOT NULL,
       SequenceNumberReminder SMALLINT NOT NULL,
       PartyIDPersonSearch BIGINT NOT NULL,
       SequenceNumberSearch SMALLINT NOT NULL,
       DateAdded TIMESTAMP DEFAULT current_timestamp,
       ActiveUntil TIMESTAMP,
       CONSTRAINT PK_SearchUsesReminder PRIMARY KEY (PartyIDPersonReminder, SequenceNumberReminder, PartyIDPersonSearch, SequenceNumberSearch)
      );
      


      The important table is the last one, which uses the two before.
      The tables PersonHasStoredReminders and PersonHasStoredSearches have the PartyIDPerson as a primary key PLUS an incremented (mini)-sequence. Therefore the last table (SearchUsesReminder) has to use both PKs, (4 columns) also as PK.

      Class Personhasstoredreminders
      package com.auctonova.ejb.persistence;
      
      import java.io.Serializable;
      import java.sql.Timestamp;
      import java.util.Set;
      import javax.persistence.Embeddable;
      import javax.persistence.EmbeddedId;
      import javax.persistence.Entity;
      import javax.persistence.JoinColumn;
      import javax.persistence.ManyToOne;
      import javax.persistence.OneToMany;
      
      @Entity
      public class Personhasstoredreminders implements Serializable {
       @EmbeddedId
       private Personhasstoredreminders.PK pk;
      
       private Timestamp activeuntil;
      
       private short active;
      
       private Timestamp schedule;
      
       private String remindername;
      
       private Timestamp dateadded;
      
       @ManyToOne
       @JoinColumn(name="partyidperson")
       private Partyisperson partyidperson;
      
       @OneToMany(mappedBy="personhasstoredreminders")
       private Set<Searchusesreminder> searchusesreminderCollection;
      
       private static final long serialVersionUID = 1L;
      
       public Personhasstoredreminders() {
       super();
       }
      
       public Personhasstoredreminders.PK getPk() {
       return this.pk;
       }
      
       public void setPk(Personhasstoredreminders.PK pk) {
       this.pk = pk;
       }
      
       public Timestamp getActiveuntil() {
       return this.activeuntil;
       }
      
       public void setActiveuntil(Timestamp activeuntil) {
       this.activeuntil = activeuntil;
       }
      
       public short getActive() {
       return this.active;
       }
      
       public void setActive(short active) {
       this.active = active;
       }
      
       public Timestamp getSchedule() {
       return this.schedule;
       }
      
       public void setSchedule(Timestamp schedule) {
       this.schedule = schedule;
       }
      
       public String getRemindername() {
       return this.remindername;
       }
      
       public void setRemindername(String remindername) {
       this.remindername = remindername;
       }
      
       public Timestamp getDateadded() {
       return this.dateadded;
       }
      
       public void setDateadded(Timestamp dateadded) {
       this.dateadded = dateadded;
       }
      
       public Partyisperson getPartyidperson() {
       return this.partyidperson;
       }
      
       public void setPartyidperson(Partyisperson partyidperson) {
       this.partyidperson = partyidperson;
       }
      
       public Set<Searchusesreminder> getSearchusesreminderCollection() {
       return this.searchusesreminderCollection;
       }
      
       public void setSearchusesreminderCollection(Set<Searchusesreminder> searchusesreminderCollection) {
       this.searchusesreminderCollection = searchusesreminderCollection;
       }
      
      
       @Embeddable
       public static class PK implements Serializable {
       private long partyidperson2;
       private short sequencenumber;
       private static final long serialVersionUID = 1L;
      
       public PK() {
       super();
       }
      
       public long getPartyidperson2() {
       return this.partyidperson2;
       }
      
       public void setPartyidperson2(long partyidperson2) {
       this.partyidperson2 = partyidperson2;
       }
      
       public short getSequencenumber() {
       return this.sequencenumber;
       }
      
       public void setSequencenumber(short sequencenumber) {
       this.sequencenumber = sequencenumber;
       }
      
       @Override
       public boolean equals(Object o) {
       if (o == this) {
       return true;
       }
       if ( ! (o instanceof PK)) {
       return false;
       }
       PK other = (PK) o;
       return (this.partyidperson2 == other.partyidperson2)
       && (this.sequencenumber == other.sequencenumber);
       }
      
       @Override
       public int hashCode() {
       return ((int) (this.partyidperson2 ^ (this.partyidperson2 >>> 32)))
       ^ this.sequencenumber;
       }
      
       }
      
      }
      


      The class Personhasstoredsearches is completely the same

      Class SearchUsesReminder:
      package com.auctonova.ejb.persistence;
      
      import java.io.Serializable;
      import java.sql.Timestamp;
      import javax.persistence.Embeddable;
      import javax.persistence.EmbeddedId;
      import javax.persistence.Entity;
      import javax.persistence.JoinColumn;
      import javax.persistence.JoinColumns;
      import javax.persistence.ManyToOne;
      
      @Entity
      public class Searchusesreminder implements Serializable {
       @EmbeddedId
       private Searchusesreminder.PK pk;
      
       private Timestamp activeuntil;
      
       private Timestamp dateadded;
      
       @ManyToOne
       @JoinColumns({
       @JoinColumn(name="sequencenumberreminder", referencedColumnName="sequencenumber"),
       @JoinColumn(name="partyidpersonreminder", referencedColumnName="partyidperson")
       })
       private Personhasstoredreminders personhasstoredreminders;
      
       @ManyToOne
       @JoinColumns({
       @JoinColumn(name="partyidpersonsearch", referencedColumnName="partyidperson"),
       @JoinColumn(name="sequencenumbersearch", referencedColumnName="sequencenumber")
       })
       private Personhasstoredsearches personhasstoredsearches;
      
       private static final long serialVersionUID = 1L;
      
       public Searchusesreminder() {
       super();
       }
      
       public Searchusesreminder.PK getPk() {
       return this.pk;
       }
      
       public void setPk(Searchusesreminder.PK pk) {
       this.pk = pk;
       }
      
       public Timestamp getActiveuntil() {
       return this.activeuntil;
       }
      
       public void setActiveuntil(Timestamp activeuntil) {
       this.activeuntil = activeuntil;
       }
      
       public Timestamp getDateadded() {
       return this.dateadded;
       }
      
       public void setDateadded(Timestamp dateadded) {
       this.dateadded = dateadded;
       }
      
       public Personhasstoredreminders getPersonhasstoredreminders() {
       return this.personhasstoredreminders;
       }
      
       public void setPersonhasstoredreminders(Personhasstoredreminders personhasstoredreminders) {
       this.personhasstoredreminders = personhasstoredreminders;
       }
      
       public Personhasstoredsearches getPersonhasstoredsearches() {
       return this.personhasstoredsearches;
       }
      
       public void setPersonhasstoredsearches(Personhasstoredsearches personhasstoredsearches) {
       this.personhasstoredsearches = personhasstoredsearches;
       }
      
      
       @Embeddable
       public static class PK implements Serializable {
       private short sequencenumbersearch;
       private long partyidpersonsearch;
       private long partyidpersonreminder;
       private short sequencenumberreminder;
       private static final long serialVersionUID = 1L;
      
       public PK() {
       super();
       }
      
       public short getSequencenumbersearch() {
       return this.sequencenumbersearch;
       }
      
       public void setSequencenumbersearch(short sequencenumbersearch) {
       this.sequencenumbersearch = sequencenumbersearch;
       }
      
       public long getPartyidpersonsearch() {
       return this.partyidpersonsearch;
       }
      
       public void setPartyidpersonsearch(long partyidpersonsearch) {
       this.partyidpersonsearch = partyidpersonsearch;
       }
      
       public long getPartyidpersonreminder() {
       return this.partyidpersonreminder;
       }
      
       public void setPartyidpersonreminder(long partyidpersonreminder) {
       this.partyidpersonreminder = partyidpersonreminder;
       }
      
       public short getSequencenumberreminder() {
       return this.sequencenumberreminder;
       }
      
       public void setSequencenumberreminder(short sequencenumberreminder) {
       this.sequencenumberreminder = sequencenumberreminder;
       }
      
       @Override
       public boolean equals(Object o) {
       if (o == this) {
       return true;
       }
       if ( ! (o instanceof PK)) {
       return false;
       }
       PK other = (PK) o;
       return (this.sequencenumbersearch == other.sequencenumbersearch)
       && (this.partyidpersonsearch == other.partyidpersonsearch)
       && (this.partyidpersonreminder == other.partyidpersonreminder)
       && (this.sequencenumberreminder == other.sequencenumberreminder);
       }
      
       @Override
       public int hashCode() {
       return this.sequencenumbersearch
       ^ ((int) (this.partyidpersonsearch ^ (this.partyidpersonsearch >>> 32)))
       ^ ((int) (this.partyidpersonreminder ^ (this.partyidpersonreminder >>> 32)))
       ^ this.sequencenumberreminder;
       }
      
       }
      
      }
      


      Exception:
      org.hibernate.AnnotationException: referencedColumnNames(partyidperson, sequencenumber) of com.auctonova.ejb.persistence.Searchusesreminder.personhasstoredsearches referencing com.auctonova.ejb.persistence.Personhasstoredsearches not mapped to a single property
       at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:165)
       at org.hibernate.cfg.FkSecondPass.doSecondPass(FkSecondPass.java:63)
       at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:428)
       at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:286)
       at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1115)
       at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1233)
       at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:154)
       at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:869)
       at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:407)
       at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:126)
       at org.jboss.ejb3.entity.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:246)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
       at java.lang.reflect.Method.invoke(Unknown Source)
      [....] and many more
      


      Thank you very much for any hint and best regards,

      P.S: The code is completely automatically generated with the Eclipse JPA (DataToolsPlatform 1.5.0)

      P.P.S The server is jboss 4.2.1 GA

      Thomas

        • 1. Re: AnnotationException: xxx not mapped to a single property
          waynebaylor

          the referenced column name looks like it's missing a "2":

          @ManyToOne
          @JoinColumns({
          @JoinColumn(name="partyidpersonsearch", referencedColumnName="partyidperson"),
          @JoinColumn(name="sequencenumbersearch", referencedColumnName="sequencenumber")
          })
          private Personhasstoredsearches personhasstoredsearches;


          and
          @Embeddable
          public static class PK implements Serializable {
          private long partyidperson2;
          private short sequencenumber;
          private static final long serialVersionUID = 1L;