Java Hibernate级联问题



----介绍性信息和问题域----


基本上我在数据库中有3个表:'User', 'Item', 'ItemsPerUser'。

表用户:

用户名(PK);密码;电子邮件

表项

名称(PK)

表ItemsPerUser

username (PK) (and FK);item_name (PK) (and FK)

当我不使用级联时,我得到一个错误:"不能添加或更新子行:外键约束失败"。

映射文件是正确的。我需要一些级联。当我在多对多关系的set属性中添加级联以将不存在的数据添加到User &项,但它正在覆盖ItemsPerUser中的数据。每当我保存一个对象,其中包含一个或多个已经在ItemsPerUser中输入的项时,它就会覆盖该行,即使PK的另一部分不是同一用户。基本上,拥有那个" item "的前一个用户被拥有相同item的新用户覆盖。如果它是一个新用户,它应该总是在表ItemsPerUser中添加一个新行,即使有一个或多个项目已经被另一个user对象输入。

----视觉样式示例----


假设我从一个空数据库开始,并插入一个新用户Roger,他有两项物品:咖啡和水。下面是一个示例(Hibernate可以正确处理):

User             ItemsPerUser               Item  
Roger            Roger-coffee               coffee  
                 Roger-water                water  

现在,当我插入一个新用户"Alfonzo",他有咖啡和苏打项时,会发生这样的情况:

User             ItemsPerUser               Item  
Roger            Alfonzo-coffee             coffee  
Alfonzo          Roger-water                water  
                 Alfonzo-soda               soda  

----代码示例----


//Mapping for databag 'User' - !! NOTE: I have deleted the cascade rule in the XML
<hibernate-mapping>
    <class name="databag.User" table="User" catalog="androiddb">
        <id name="username" type="string">
            <column name="username" length="45" />
            <generator class="assigned" />
        </id>
        <property name="password" type="string">
            <column name="password" length="45" not-null="true" />
        </property>
        <property name="email" type="string">
            <column name="email" length="45" not-null="true" unique="true" />
        </property>
        <set name="items" inverse="false" table="itemsperuser">
            <key>
                <column name="username" length="45" not-null="true" />
            </key>
            <many-to-many entity-name="databag.Items">
                <column name="item_name" length="45" not-null="true"/>
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>
//Mapping for Item
<hibernate-mapping>
    <class name="databag.Item" table="item" catalog="androiddb">
        <id name="name" type="string">
            <column name="name" length="45" />
            <generator class="assigned" />
        </id>
        <set name="users" inverse="false" table="itemsperuser">
            <key>
                <column name="item_naam" length="45" not-null="true" />
            </key>
            <many-to-many entity-name="databag.User">
                <column name="username" length="45" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>
//Saving an object
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction trans = session.beginTransaction();
session.save((User)o);
trans.commit();
session.close();

注意:'(User)o'包含一个或多个条目

不能两边都设置逆="false"。Hibernate不能在同一个表中持久化两个集合(Item中的用户和User中的项),除非其中一个被称为"逆",并且可以在写入时忽略。只有在读取时才会被填满。

我在Item一侧设置了inverse="true"。

那么您必须先保存项目,然后将它们添加到用户,然后保存用户。