Java Hibernate 级联问题

标签 java mysql hibernate orm mapping

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


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

表用户:

用户名(PK); 密码; 邮箱

表项

姓名(PK)

每用户表项数

用户名(PK)(和 FK); item_name(PK)(和 FK)

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

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

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


假设我从一个空数据库开始,然后插入一个新用户 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' 不包含一个或多个项目。

最佳答案

你不能在两边都设置 inverse="false"。 Hibernate 不能将两个集合(用户在项目中,项目在用户中)保存在同一个表中,除非其中一个被称为“反向”,并且可以在写入时被安全地忽略。只有在阅读时才会被填满。

我会在 Item 端设置 inverse="true"。

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

关于Java Hibernate 级联问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172285/

相关文章:

java - hibernate/JPA : ManyToMany and OneToMany relationship on same attribute

java - Java 中的软引用 LinkedHashMap?

mysql - 锁是否通过复制传播?

php - Symfony Doctrine 中的 Createquery、左连接和内连接

hibernate - Spring Boot + JPA + Hibernate : Unable to locate persister

java - Spring MVC quartz : how to set the scheduler from the view or a html page

java - 你能推荐一个用于商业用途的 map API 吗?

mysql - 'order clause' 中的未知列

hibernate - 无法以一对一关系更新拥有方的属性

Android Groovy 网络服务