AnnotationException: xxx not mapped to a single property...
ttrepper Aug 31, 2007 5:51 AMHi 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