Java Hibernate集合的问题

Java Hibernate集合的问题,java,hibernate,Java,Hibernate,我不熟悉Hibernate,我正在尝试在我的POJO类Person和Event之间创建映射。一个人有一组事件,如下所示: 事件类及其映射文件的POJO: public class Event { private Long id; private String title; private Date date; // setter & getter methods } <class name="Event" table="EVENTS">

我不熟悉Hibernate,我正在尝试在我的POJO类Person和Event之间创建映射。一个人有一组事件,如下所示:

事件类及其映射文件的POJO:

public class Event {
    private Long id;
    private String title;
    private Date date;
    // setter & getter methods
}

<class name="Event" table="EVENTS">
    <id name="id" column="EVENT_ID">
        <generator class="native" />
    </id>
    <property name="title" />
    <property name="date" type="timestamp" column="EVENT_DATE" />      
 </class>
当我运行此程序时,我会看到以下日志,例外情况是未找到父密钥:

Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into EVENTS (EVENT_DATE, title, EVENT_ID) values (?, ?, ?)
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into PERSON_NEW (age, firstname, lastname, PERSON_ID) values (?, ?, ?, ?)
Hibernate: select person0_.PERSON_ID as PERSON1_1_0_, person0_.age as age1_0_, person0_.firstname as firstname1_0_, person0_.lastname as lastname1_0_ from PERSON_NEW person0_ where person0_.PERSON_ID=?
Hibernate: select events0_.PERSON_ID as PERSON1_1_1_, events0_.EVENT_ID as EVENT2_2_1_, event1_.EVENT_ID as EVENT1_0_0_, event1_.EVENT_DATE as EVENT2_0_0_, event1_.title as title0_0_ from PERSON_EVENTS events0_, EVENTS event1_ where events0_.EVENT_ID=event1_.EVENT_ID and events0_.PERSON_ID=?
Hibernate: insert into PERSON_EVENTS (PERSON_ID, EVENT_ID) values (?, ?)
02:18:59,095  WARN SqlExceptionHelper:143 - SQL Error: 2291, SQLState: 23000
02:18:59,095 ERROR SqlExceptionHelper:144 - ORA-02291: integrity constraint (LEARNING.FK4A94943B0A1327A) violated - parent key not found

Exception in thread "main" org.hibernate.exception.ConstraintViolationException: ORA-02291: integrity constraint (LEARNING.FK4A94943B0A1327A) violated - parent key not found

    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:128)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)

我正在使用Hibernate3.x,请帮助我在代码中犯了什么错误?从我的Oracle数据库中,我可以看到Event和Person的记录已成功存储,但联接表为空,因为我在运行此程序时遇到异常。

您需要将
Person
映射文件的
事件集
项更改为:

<set name="events" table="PERSON_EVENTS" cascade="save-update">
        <key column="PERSON_ID" />
        <many-to-many column="EVENT_ID" class="Event" unique="true"/>
</set>

首先,请在使用集合(如集合)时使用类型约束,而不是将其保留为原始集合类型。此外,您不必在实例变量声明中的Person类中创建事件集(我们应该使用getter和setter)。
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into EVENTS (EVENT_DATE, title, EVENT_ID) values (?, ?, ?)
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into PERSON_NEW (age, firstname, lastname, PERSON_ID) values (?, ?, ?, ?)
Hibernate: select person0_.PERSON_ID as PERSON1_1_0_, person0_.age as age1_0_, person0_.firstname as firstname1_0_, person0_.lastname as lastname1_0_ from PERSON_NEW person0_ where person0_.PERSON_ID=?
Hibernate: select events0_.PERSON_ID as PERSON1_1_1_, events0_.EVENT_ID as EVENT2_2_1_, event1_.EVENT_ID as EVENT1_0_0_, event1_.EVENT_DATE as EVENT2_0_0_, event1_.title as title0_0_ from PERSON_EVENTS events0_, EVENTS event1_ where events0_.EVENT_ID=event1_.EVENT_ID and events0_.PERSON_ID=?
Hibernate: insert into PERSON_EVENTS (PERSON_ID, EVENT_ID) values (?, ?)
02:18:59,095  WARN SqlExceptionHelper:143 - SQL Error: 2291, SQLState: 23000
02:18:59,095 ERROR SqlExceptionHelper:144 - ORA-02291: integrity constraint (LEARNING.FK4A94943B0A1327A) violated - parent key not found

Exception in thread "main" org.hibernate.exception.ConstraintViolationException: ORA-02291: integrity constraint (LEARNING.FK4A94943B0A1327A) violated - parent key not found

    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:128)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
<set name="events" table="PERSON_EVENTS" cascade="save-update">
        <key column="PERSON_ID" />
        <many-to-many column="EVENT_ID" class="Event" unique="true"/>
</set>
Event event = new Event();
event.setTitle(...);
event.setDate(...);

Set<Event> events = new HashSet<Event>();
events.add(event);

Person p = new Person();
p.setAge(...);
...
p.setEvents(events);

session.save(p);