更改后,Hibernate复合元素不会保存到DB

时间:2014-11-13 10:13:31

标签: java hibernate

当我尝试将对象包含复合元素保存到DB时,我遇到了问题。

我有下一个数据库结构

创建表"安全"。"用户" (

    "ID_USER"            INTEGER NOT NULL PRIMARY KEY,
    "NAME"               VARCHAR(255) NOT NULL,
    "PSW_HASH"           VARCHAR(255)

CREATE TABLE" Security"。" OBJECTS" (

    "ID_OBJECT"          INTEGER NOT NULL PRIMARY KEY,
    "CODE"               VARCHAR(50) NOT NULL,
    "NAME"               VARCHAR(255) NOT NULL

创建表"安全"。" USERSOBJECTSRIGHT" (

    "ID_USEROBJECT"      INTEGER NOT NULL PRIMARY KEY,
    "ID_OBJECT"          INTEGER NOT NULL REFERENCES Security.OBJECTS(ID_OBJECT),
    "ID_USER"            INTEGER NOT NULL REFERENCES Security.USERS(ID_USER),
    "RIGHT"              SMALLINT NOT NULL

我将多对多关系映射到我的模型,就像这样

<class name="CPUser"
           table="Security.USERS" mutable="true">
        <!-- simple property mapping-->
        <set name="userRights" table="Security.USERSOBJECTSRIGHT" inverse="true" lazy="false"                     fetch="select">
            <key>
                <column name="ID_USER" not-null="true"/>
            </key>
            <composite-element class="app.domain.CPUserRights">
                <many-to-one name="rights" column="ID_OBJECT" class="app.domain.CPRights" lazy="false"/>
                <property name="right" type="int" column="RIGHT"/>
            </composite-element>

        </set>
    </class>

 <class name="app.domain.CPRights"
           table="Security.OBJECTS" mutable="false">

        <!-- simple property mapping-->
    </class>

<class name="CPUserRights"
           table="Security.USERSOBJECTSRIGHT" mutable="true">

        <property
                name="right"
                type="java.lang.Integer"
                column="RIGHT"
                />
    </class>

读取正常,如果我尝试在User类中更改简单属性(如名称),它们也会在DB中更改。

但是当我尝试为用户改变复合元素中的数据时:

    CPUser user = userService.getCPUser(id);

    for (CPUserRights rights : user.getUserRights()) {
        rights.setRight(2);
    }

    userService.updateCPUser(user);

此数据不存储到DB。

我不明白为什么。请帮忙。

1 个答案:

答案 0 :(得分:0)

找到解决方案:我手动存储复合元素中的数据,就像那样

CPUser user = userService.getCPUser(id);

for (CPUserRights rights : user.getUserRights()) {
    rights.setRight(2);

    userRightService.updateCPUserRights(rights);
}

// userService.updateCPUser(user);