Hibernate不必要地更新连接表

时间:2012-10-30 22:24:47

标签: java hibernate join sql-update

基本上,我有2个课程P& M,及其对应的表格T_P& T_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">
    <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更新DB时。很可能Hibernate会做一批更新,一个到T_P,几个到T_M,我知道后面的部分没有必要,因为我没有改变那些女士但是我认为因为我的对象是分离的,所以hibernate必须更新一切。

所以我的问题是,在我的情况下,我可以要求Hibernate仅部分更新,而不是进行过多的DB命中吗?或者还有其他建议来优化这一点。但这是一个遗留计划,我可能无法做出重大改变。

1 个答案:

答案 0 :(得分: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"

您将浏览以下link,其中包含父子关系的简单/基本示例。

父子关系的样本映射如下。

/*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"/>

我希望这有助于您解决问题。