Hi, I have some trouble with my code.
I have two classes Person and Member (Member extends Person). I want work with two tables (Person and Member) and I use the inheritanceType.Joined Strategy.
This is my code :
Code:
package be.fgov.caamihziv.commons.fdmassu.person;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import be.fgov.caamihziv.commons.fdmassu.infoContact.InfoContact;
@Entity
@Table(name="PERSON")
@Inheritance(strategy=InheritanceType.JOINED)
@SequenceGenerator(name="PSN_GEN", sequenceName="PSN_SEQ")
public abstract class Person {
protected long id;
private int title;
private String lastName;
private String firstName1;
private String firstName2;
private int sex;
private int preferredLang;
private int administrativeLang;
private InfoContact infoContact;
/**
* @return Returns the id.
*/
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PSN_GEN")
public long getId() {
return id;
}
/**
* @param id The id to set.
*/
public void setId(long id) {
this.id = id;
}
/**
* @return Returns the administrativeLang.
*/
@Column(name="FK_R_LGE_ID_ADMIN")
public int getAdministrativeLang() {
return administrativeLang;
}
/**
* @param administrativeLang The administrativeLang to set.
*/
public void setAdministrativeLang(int administrativeLang) {
this.administrativeLang = administrativeLang;
}
/**
* @return Returns the firstName1.
*/
@Column(name="FIRSTNAME1")
public String getFirstName1() {
return firstName1;
}
/**
* @param firstName1 The firstName1 to set.
*/
public void setFirstName1(String firstName1) {
this.firstName1 = firstName1;
}
/**
* @return Returns the firstName2.
*/
@Column(name="FIRSTNAME2")
public String getFirstName2() {
return firstName2;
}
/**
* @param firstName2 The firstName2 to set.
*/
public void setFirstName2(String firstName2) {
this.firstName2 = firstName2;
}
/**
* @return Returns the infoContact.
*/
@Transient
public InfoContact getInfoContact() {
return infoContact;
}
/**
* @param infoContact The infoContact to set.
*/
public void setInfoContact(InfoContact infoContact) {
this.infoContact = infoContact;
}
/**
* @return Returns the lastName.
*/
@Column(name="LASTNAME")
public String getLastName() {
return lastName;
}
/**
* @param lastName The lastName to set.
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* @return Returns the preferredLang.
*/
@Column(name="FK_R_LGE_ID_PREFERRED")
public int getPreferredLang() {
return preferredLang;
}
/**
* @param preferredLang The preferredLang to set.
*/
public void setPreferredLang(int preferredLang) {
this.preferredLang = preferredLang;
}
/**
* @return Returns the sex.
*/
@Column(name="FK_R_GDR_ID")
public int getSex() {
return sex;
}
/**
* @param sex The sex to set.
*/
public void setSex(int sex) {
this.sex = sex;
}
/**
* @return Returns the title.
*/
@Column(name="FK_R_TTE_ID")
public int getTitle() {
return title;
}
/**
* @param title The title to set.
*/
public void setTitle(int title) {
this.title = title;
}
}
Code:
package be.fgov.caamihziv.commons.fdmassu.person;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Transient;
import be.fgov.caamihziv.commons.fdmassu.infoContact.InfoContactMember;
import be.fgov.caamihziv.commons.fdmassu.reference.institution.RegionalOffice;
/**
*
* @author ipa
*
*/
@Entity
@Table(name="MEMBER")
public class Member extends Person {
private int numInternal;
private int oldIVerzekGd;
private int oldIVerzekRg;
private int oldIVerzekNr;
private int oldIVerzekCd;
private long niss;
private Date dateBirth;
private Date dateDeath;
private boolean nationalRegistry;
private boolean avz;
private int civilState;
private String nationality;
private int state;
/**
* @supplierCardinality 1
* @clientCardinality 0..*
* @clientQualifier is pac of
* @supplierQualifier is the holder of*/
private Member memberHolder;
/**
* @clientCardinality 1
* @supplierCardinality 1..*
*/
private InfoContactMember infoContactMember;
private RegionalOffice currentRegionalOffice;
/**
* @return Returns the avz.
*/
public boolean isAvz() {
return avz;
}
/**
* @param avz The avz to set.
*/
public void setAvz(boolean avz) {
this.avz = avz;
}
/**
* @return Returns the civilState.
*/
@Column(name="FK_R_MRL_STS_ID")
public int getCivilState() {
return civilState;
}
/**
* @param civilState The civilState to set.
*/
public void setCivilState(int civilState) {
this.civilState = civilState;
}
/**
* @return Returns the currentRegionalOffice.
*/
@Transient
public RegionalOffice getCurrentRegionalOffice() {
return currentRegionalOffice;
}
/**
* @param currentRegionalOffice The currentRegionalOffice to set.
*/
public void setCurrentRegionalOffice(RegionalOffice currentRegionalOffice) {
this.currentRegionalOffice = currentRegionalOffice;
}
/**
* @return Returns the dateBirth.
*/
@Column(name="BIRTHDATE")
@Temporal(TemporalType.DATE)
public Date getDateBirth() {
return dateBirth;
}
/**
* @param dateBirth The dateBirth to set.
*/
public void setDateBirth(Date dateBirth) {
this.dateBirth = dateBirth;
}
/**
* @return Returns the dateDeath.
*/
@Column(name="DEATHDATE")
@Temporal(TemporalType.DATE)
public Date getDateDeath() {
return dateDeath;
}
/**
* @param dateDeath The dateDeath to set.
*/
public void setDateDeath(Date dateDeath) {
this.dateDeath = dateDeath;
}
/**
* @return Returns the infoContactMember.
*/
@Transient
public InfoContactMember getInfoContactMember() {
return infoContactMember;
}
/**
* @param infoContactAssure The infoContactAssure to set.
*/
public void setInfoContactAssure(InfoContactMember infoContactMember) {
this.infoContactMember = infoContactMember;
}
/**
* @return Returns the memberHolder.
*/
@Transient
public Member getMemberHolder() {
return memberHolder;
}
/**
* @param memberHolder The memberHolder to set.
*/
public void setMemberHolder(Member memberHolder) {
this.memberHolder = memberHolder;
}
/**
* @return Returns the nationality.
*/
@Column(name="NATIONALITY")
public String getNationality() {
return nationality;
}
/**
* @param nationality The nationality to set.
*/
public void setNationality(String nationality) {
this.nationality = nationality;
}
/**
* @return Returns the nationalRegistry.
*/
@Column(name="NATIONAL_REGISTRY")
public boolean isNationalRegistry() {
return nationalRegistry;
}
/**
* @param nationalRegistry The nationalRegistry to set.
*/
public void setNationalRegistry(boolean nationalRegistry) {
this.nationalRegistry = nationalRegistry;
}
/**
* @return Returns the niss.
*/
@Column(name="NISS")
public long getNiss() {
return niss;
}
/**
* @param niss The niss to set.
*/
public void setNiss(long niss) {
this.niss = niss;
}
/**
* @return Returns the numInternal.
*/
@Column(name="NUM_INTERNAL")
public int getNumInternal() {
return numInternal;
}
/**
* @param numInternal The numInternal to set.
*/
public void setNumInternal(int numInternal) {
this.numInternal = numInternal;
}
/**
* @return Returns the oldIVerzekCd.
*/
@Column(name="OLD_VERZEK_CD")
public int getOldIVerzekCd() {
return oldIVerzekCd;
}
/**
* @param oldIVerzekCd The oldIVerzekCd to set.
*/
public void setOldIVerzekCd(int oldIVerzekCd) {
this.oldIVerzekCd = oldIVerzekCd;
}
/**
* @return Returns the oldIVerzekGd.
*/
@Column(name="OLD_VERZEK_GD")
public int getOldIVerzekGd() {
return oldIVerzekGd;
}
/**
* @param oldIVerzekGd The oldIVerzekGd to set.
*/
public void setOldIVerzekGd(int oldIVerzekGd) {
this.oldIVerzekGd = oldIVerzekGd;
}
/**
* @return Returns the oldIVerzekNr.
*/
@Column(name="OLD_VERZEK_NR")
public int getOldIVerzekNr() {
return oldIVerzekNr;
}
/**
* @param oldIVerzekNr The oldIVerzekNr to set.
*/
public void setOldIVerzekNr(int oldIVerzekNr) {
this.oldIVerzekNr = oldIVerzekNr;
}
/**
* @return Returns the oldIVerzekRg.
*/
@Column(name="OLD_VERZEK_RG")
public int getOldIVerzekRg() {
return oldIVerzekRg;
}
/**
* @param oldIVerzekRg The oldIVerzekRg to set.
*/
public void setOldIVerzekRg(int oldIVerzekRg) {
this.oldIVerzekRg = oldIVerzekRg;
}
/**
* @return Returns the state.
*/
@Column(name="FK_R_MBR_STE_ID")
public int getState() {
return state;
}
/**
* @param state The state to set.
*/
public void setState(int state) {
this.state = state;
}
}
For testing
Code:
Member alb=testDAO.getMember((long)4505);
System.out.println(alb.getId());
Error
Code:
Hibernate: select member0_.id as id1_0_, member0_1_.FK_R_LGE_ID_ADMIN as FK2_1_0_, member0_1_.FIRSTNAME1 as FIRSTNAME3_1_0_, member0_1_.FIRSTNAME2 as FIRSTNAME4_1_0_, member0_1_.LASTNAME as LASTNAME1_0_, member0_1_.FK_R_LGE_ID_PREFERRED as FK6_1_0_, member0_1_.FK_R_GDR_ID as FK7_1_0_, member0_1_.FK_R_TTE_ID as FK8_1_0_, member0_.FK_R_MBR_STE_ID as FK2_2_0_, member0_.avz as avz2_0_, member0_.FK_R_MRL_STS_ID as FK4_2_0_, member0_.BIRTHDATE as BIRTHDATE2_0_, member0_.DEATHDATE as DEATHDATE2_0_, member0_.NATIONALITY as NATIONAL7_2_0_, member0_.NATIONAL_REGISTRY as NATIONAL8_2_0_, member0_.NISS as NISS2_0_, member0_.NUM_INTERNAL as NUM10_2_0_, member0_.OLD_VERZEK_CD as OLD11_2_0_, member0_.OLD_VERZEK_GD as OLD12_2_0_, member0_.OLD_VERZEK_NR as OLD13_2_0_, member0_.OLD_VERZEK_RG as OLD14_2_0_, member0_.BIRTHPLACE as BIRTHPLACE2_0_, member0_.DEATHPLACE as DEATHPLACE2_0_, decode(member0_.id, 1) as clazz_0_ from MEMBER member0_, PERSON member0_1_, MEMBER member0_2_ where member0_.id=member0_1_.id and member0_.id=member0_2_.id and member0_.id=?
WARN JDBCExceptionReporter.logExceptions - SQL Error: 938, SQLState: 42000
WARN JDBCExceptionReporter.logExceptions - SQL Error: 938, SQLState: 42000
ERROR JDBCExceptionReporter.logExceptions - ORA-00938: not enough arguments for function
ERROR JDBCExceptionReporter.logExceptions - ORA-00938: not enough arguments for function
Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not load an entity: [be.fgov.caamihziv.commons.fdmassu.person.Member#4505]; bad SQL grammar [select member0_.id as id1_0_, member0_1_.FK_R_LGE_ID_ADMIN as FK2_1_0_, member0_1_.FIRSTNAME1 as FIRSTNAME3_1_0_, member0_1_.FIRSTNAME2 as FIRSTNAME4_1_0_, member0_1_.LASTNAME as LASTNAME1_0_, member0_1_.FK_R_LGE_ID_PREFERRED as FK6_1_0_, member0_1_.FK_R_GDR_ID as FK7_1_0_, member0_1_.FK_R_TTE_ID as FK8_1_0_, member0_.FK_R_MBR_STE_ID as FK2_2_0_, member0_.avz as avz2_0_, member0_.FK_R_MRL_STS_ID as FK4_2_0_, member0_.BIRTHDATE as BIRTHDATE2_0_, member0_.DEATHDATE as DEATHDATE2_0_, member0_.NATIONALITY as NATIONAL7_2_0_, member0_.NATIONAL_REGISTRY as NATIONAL8_2_0_, member0_.NISS as NISS2_0_, member0_.NUM_INTERNAL as NUM10_2_0_, member0_.OLD_VERZEK_CD as OLD11_2_0_, member0_.OLD_VERZEK_GD as OLD12_2_0_, member0_.OLD_VERZEK_NR as OLD13_2_0_, member0_.OLD_VERZEK_RG as OLD14_2_0_, member0_.BIRTHPLACE as BIRTHPLACE2_0_, member0_.DEATHPLACE as DEATHPLACE2_0_, decode(member0_.id, 1) as clazz_0_ from MEMBER member0_, PERSON member0_1_, MEMBER member0_2_ where member0_.id=member0_1_.id and member0_.id=member0_2_.id and member0_.id=?]; nested exception is java.sql.SQLException: ORA-00938: not enough arguments for function
java.sql.SQLException: ORA-00938: not enough arguments for function
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:799)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1132)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:93)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:81)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:889)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:826)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:819)
at org.springframework.orm.hibernate3.HibernateTemplate$1.doInHibernate(HibernateTemplate.java:451)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:365)
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:445)
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:439)
at be.fgov.caamihziv.commons.fdmassu.DomainDAO.getMember(DomainDAO.java:24)
at be.fgov.caamihziv.commons.fdmassu.TestDomainDAO.main(TestDomainDAO.java:32)
In fact I found the bad part of the generated sql : decode(member0_.id, 1) as clazz_0_
Decode is a function with a minimum of 3 value but in the generated code I have only two.
May be I made a mistake in my annotation(it's new for me) but I don't find it.
(Some property of Person and Member are transient because they link other classes but the annotation for them isn't wrote yet)
The next step is : adding extend classes at Member, but not in separated table. I wish persisted this classes in the same table (Member), can I use a discriminator to do that (If it possible, what is the syntax?)
Could someone help me? Thanks in advance
I work with Hibernate 3.1.1.jar and hibernate-annotations-3.1beta8.jar. My oracle server is oracle 10g