我在休眠映射中声明了一个父/子关系。父级包含子级对象的集合。创建并保存包含新的子对象的新父对象时,出现错误消息:


  无法将NULL插入(“ SCHEMA”。“ ACCESS_LIST_MEMBERS”。“ LIST_ID”)


这是父级映射:

<hibernate-mapping>
<class name="AccessLists" optimistic-lock="version" schema="schema" table="ACCESS_LISTS">
<id name="id" type="java.lang.Integer">
  <column name="ID" precision="38" scale="0"/>
  <generator class="sequence">
        <param name="sequence">ACCESS_LISTS_SEQ</param>
  </generator>
</id>
<property name="userId" type="java.lang.Integer">
  <column name="USER_ID" not-null="true" precision="38" scale="0"/>
</property>
<property name="name" type="string">
  <column length="30" name="NAME" not-null="true"/>
</property>
<set name="accessListMembers" cascade="all" table="ACCESS_LIST_MEMBERS" inverse="false" fetch="select">
    <key>
        <column name="LIST_ID" precision="38" scale="0" not-null="true" />
    </key>
    <one-to-many class="AccessListMembers"  />
</set>
</class>
</hibernate-mapping>


子映射:

<hibernate-mapping>
<class name="AccessListMembers" optimistic-lock="version" schema="schema" table="ACCESS_LIST_MEMBERS">
<id name="id" type="java.lang.Integer">
  <column name="ID" />
  <generator class="sequence">
        <param name="sequence">ACCESS_LIST_MBRS_SEQ</param>
  </generator>
</id>
<property name="listId" type="java.lang.Integer">
    <column name="LIST_ID" not-null="true" />
</property>
<property name="wwid" type="string">
  <column length="5" name="WWID" not-null="true"/>
</property>
<join table="AccessLists" inverse="true">
        <key column="ID"/>
        <many-to-one name="accessList" column="LIST_ID" not-null="true"/>
</join>
</class>
</hibernate-mapping>


我以为在子映射中添加联接信息会使休眠知道从父对象ACCESS_LIST.ID获取LIST_ID,但这不会发生。执行以下代码时出现错误:

public static void saveList(AccessLists list) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction tx = session.beginTransaction();
    try {
        session.saveOrUpdate(list);
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
        throw e;
    }
}


我不想在AccessList的AccessListMembers集合中的每个对象上手动设置LIST_ID。我已经阅读了JBOSS文档,但我认为我误解了一对多和多对一关系的工作方式。

如何设置我的映射,以便休眠知道在AccessList上执行INSERT,在AccessListMembers上更新LIST_ID以及在AccessListMembers上执行INSERT?

最佳答案

您必须对父母和孩子进行双重绑定。您将孩子绑定到父母,好的-但是您没有像这样将父母绑定到孩子:

accessListMember.setList(accessList);


顺便说一句,您可能需要进行技术审查并介绍IoC。自己使用交易是古老的,神秘的和危险的知识。我看到程序员必须使用事务,因为他们必须使用事务保存点(如果是这种情况),请玩得开心。

08-05 21:13