0

假设我有:

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

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

这有一个从到table_1的FK (为什么不呢?IDK,这个项目已经是这样了:()property_xtable_2.property_x
table_2.id

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>

问题是我想使用 保存一个对象Table1session.save(objTable1)而不是在数据库中创建一个新的 Table2 条目,也不需要加载它。我过去通过创建一个新对象来完成此操作,并且只设置主键值,将其他所有内容留空,并且不让它更新Table2表,但这不是 PK >_<。

现在,假设我有table_2一个条目with id=5, property_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 文件上避免这种情况?

4

1 回答 1

0

这是级联注释,如果您不希望在数据库中创建表 2,请不要将其设置为子项,但如果您希望更新表 2,则需要表 2 id。

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

于 2013-05-09T17:43:59.637 回答