0

基本上,我有 2 个类 P 和 M,以及它们对应的表 T_P 和 T_M,它们以一对多的关系连接,一个 P 有一组 Ms。像这样:

<class name="P" table="T_P">
    <set name="ms" cascade="all" lazy="false" inverse="true">
        <key column="P_ID" not-null="true" foreign-key="FK_M_P"/>
        <one-to-many class="M"/>
    </set>
</class>
<class name="M" table="T_M">
    <many-to-one name="p" column="P_ID" foreign-key="FK_M_P" class="P"
                 update="false" not-null="true" cascade="none"/>
</class>

现在,当我对 P 进行更改并要求 Hibernate 更新数据库时。Hibernate 很可能会做一批更新,一个到 T_P,几个到 T_M,我知道后面的部分没有必要,因为我没有更改那些 Ms。但我认为因为我的对象是分离的,所以 hibernate 必须更新一切。

所以我的问题是,在我的情况下,我可以要求 Hibernate 只更新部分,而不是进行过多的 DB 命中吗?或其他优化这一点的建议也值得赞赏。但这是一个遗留程序,我可能无法做出重大改变。

4

1 回答 1

0

inverser="true"映射而言,它仅适用于双向关联。 在您的配置中,您没有提到 M 中的 P 映射。

<class name="P" table="T_P">
<set name="ms" cascade="all" lazy="false" inverse="true">
    <key column="P_ID" not-null="true" foreign-key="FK_M_P"/>
    <one-to-many class="M"/>
</set>
</class>
<class name="M" table="T_M">
     /*mention mapping for P here, if you want to use inverse property properly*/
</class>

问题可能是由于cascade="all"映射。尝试cascade="save-update"在映射中设置集合。

您通过以下链接,其中包含父子关系的简单/基本示例。

父子关系的示例映射如下。

/*parent contain set of child entity*/
<set name="children" inverse="true">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>


/*child has reference of parent*/
<many-to-one name="parent" column="parent_id" not-null="true"/>

我希望这可以帮助您解决问题。

于 2012-10-31T12:16:46.870 回答