I know you posted this asking for help but since you seemed to have figured it out, do you think you could help me? I didn't really want to create another topic on exactly the same subject.
I'm trying to follow the example in the Hibernate documentation where there's two classes, Employee and Person, where each Employee needs access to a Person object.
This is what I have so far...
Note - Hibernate-mapping tags are there, I just didn't copy them
Employee.hbm.xml
Code:
<class name="members.Employee" table="EMPLOYEE">
<id name="id" column="EMPLOYEE_ID">
<generator class="native"/>
</id>
<property name="job" />
<one-to-one name="person" class="members.Person" cascade="save-update"/>
</class>
The Employee.java instance variables are
private Long id;
private String job;
private Person person;
Person.hbm.xmlCode:
<class name="members.Person" table="PERSON">
<id name="id" column="EMPLOYEE_ID">
<generator class="foreign">
<param name="property">employee</param>
</generator>
</id>
<property name="name" />
<one-to-one name="employee" class="members.Employee" constrained="true"/>
</class>
The Person.java instance variables are
private Long id;
private String name;
private Employee employee;
I'm calling this method and only this method right now to test it.
Code:
public Long addEmployee(String job){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Employee e = new Employee();
e.setJob(job);
session.save(e);
Person p = new Person();
p.setName("A name");
p.setEmployee(e);
e.setPerson(p);
session.getTransaction().commit();
return e.getId();
}
When I run it I get a series of statements creating the tables (I have the drop/recreate enabled) followed by:
Hibernate: insert into EMPLOYEE (job, EMPLOYEE_ID) values (?, null)
Hibernate: call identity()
Hibernate: insert into PERSON (name, EMPLOYEE_ID) values (?, ?)
19:21:07,741 WARN JDBCExceptionReporter:71 - SQL Error: -28, SQLState: S0022
19:21:07,751 ERROR JDBCExceptionReporter:72 - Column not found: NAME in statement [insert into PERSON (name, EMPLOYEE_ID) values (?, ?)]
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert: [members.Person]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:65)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2078)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2427)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1007)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:354)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at members.MemberManager.addEmployee(MemberManager.java:72)
at members.MemberManager.main(MemberManager.java:21)
Caused by: java.sql.SQLException: Column not found: NAME in statement [insert into PERSON (name, EMPLOYEE_ID) values (?, ?)]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:442)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:93)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:86)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:171)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2048)
... 12 more
19:21:07,761 ERROR AbstractFlushingEventListener:299 - Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: could not insert: [members.Person]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:65)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2078)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2427)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1007)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:354)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at members.MemberManager.addEmployee(MemberManager.java:72)
at members.MemberManager.main(MemberManager.java:21)
Caused by: java.sql.SQLException: Column not found: NAME in statement [insert into PERSON (name, EMPLOYEE_ID) values (?, ?)]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:442)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:93)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:86)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:171)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2048)
... 12 more
I'm completely lost as to what to do here. I've spent probably 8+ hours looking over various help sites and testing random tag changes, but I can't get it to work. If I remove the part attaching the Person object and just save an employee with a job it works, and it'll give me an ID, but when I try to retrieve the "job" value using that ID I get "could not load an entity: [members.Employee#1]".
If you (or anyone else reading this) could help me I would
greatly appreciate it. Getting many-to-many to work was relatively easy but one-to-one seems impossible right now.