Hibernate何时创建从FK到非PK列的新条目?

时间:2013-05-09 17:30:44

标签: java hibernate jpa

假设我有:

-- table_1 -------------------  
|id      | property_x | data |
------------------------------

-- table_2 ------------------------
|id      | property_x | moar_data |
-----------------------------------

而且table_1的FK从property_xtable_2.property_x (为什么不table_2.id?IDK,这个项目已经是这样的:()

HBM看起来像这样:

<!-- Table 1 -->
<hibernate-mapping package="com.example">
    <class name="Table1" table="table_1">
        <id column="id" type="integer" name="id">
            <generator class="native"/>
        </id>
        <many-to-one class="Table2" fetch="join" name="table2" not-null="false">
            <column name="property_x" />
        </many-to-one>
    </class>
</hibernate-mapping>

<!-- Table 2 -->
<hibernate-mapping package="com.example">
    <class name="Table2" table="table_2">
        <id column="id" type="integer" name="id">
            <generator class="native"/>
        </id>
        <property column="property_x" name="propertyX" type="string"/>
    </class>
</hibernate-mapping>

问题是我想使用Table1保存对象session.save(objTable1),而不在DB中创建新的Table2条目,也不加载它。 我过去通过创建一个新对象,仅设置主键值,将其他所有内容留空,并且不让它更新Table2表来完成此操作,但这不是PK&gt; _&lt;。

现在,假设我在table_2中有一个条目with id=5property_x="EX"。当我做以下事情时......

// example method
public void saveSomething(Sessions sess) {
    Table1 table1 = new Table1();
    Table2 table2 = new Table2();

    table2.setPropertyX("EX");
    table1.setTable2(table2);

    sess.save(table1);
}

...它创建了一个新条目,我猜是因为Table2的PK(id)未设置。

我的问题是,hibernate如何决定从FK对象在数据库中创建一个新条目?有没有办法在HBM文件中避免这种情况?

1 个答案:

答案 0 :(得分:0)

这是级联anotation,如果你不想在db中创建表2,不要将它设置为子节点,但是如果你想要更新表2,你需要表2 id。

或者,你可以在表1的hbm或cascade =“update”中设置cascade =“none”,但是如果没有id,表2仍然不会更新。