我使用了“每层次结构策略类”来映射Hibernate中的以下类层次结构。
我有 Item 作为抽象类。 以下是具体的: 图书 的杂志 的 DVD CD
我的映射非常适合保存和加载,但在更新具有不同类的项目时它无法正常工作。 我正在为上述每个类使用鉴别器。
我的item.hbm.xml就像:
<!-- language: lang-xml -->
<hibernate-mapping>
<class name="my.hibernate.items.Item" discriminator-value="item"
table="testitem" catalog="efeu">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="native" />
</id>
<discriminator column="item_type" type="string" length="8" />
<subclass name="my.hibernate.items.DVD" discriminator-value="DVD">
<property name="duration" type="java.lang.Integer" column="duration" />
<property name="trackNumber" type="java.lang.Integer"
column="trackNumber" />
</subclass>
<subclass name="my.hibernate.items.Journal"
discriminator-value="Journal">
<property name="serialNumber" type="java.lang.Integer"
column="serial_number" />
</subclass>
</class>
</hibernate-mapping>
并且为了更新我使用这个方法:
<!-- language: lang-java -->
public static void updateItem(Item newItem){
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
session.update(newItem);// I tried merge too. it created a new row
tx.commit();
session.close();
}
我发送给updateItem方法的类实例没有区别。所有字段都被更新,除了鉴别器,所以如果它是一本书仍然是一本书,我不能将它转换为CD,DVD或期刊,用这种对象作为参数调用上述方法。
我认为我在做什么很清楚。我知道我知道数据库表中id = 111的行是Book对象。所以我做了以下几点:
<!-- language: lang-java -->
Item cd = new CD();
cd.setId(111);
cd.setXXXProperties()
Item.updateItem(cd);
很明显,cd在调用方法之前是暂时的,我之前没有加载id = 111的行。
如何让Hibernate在调用update方法时更改discriminator列?
答案 0 :(得分:3)
无法更新discriminator
值。你所经历的是正确的。创建对象(作为CD或书籍)后,它不会更改其类型。
在此处阅读更多内容:5.1.6.1.1. Discriminator
<discriminator
column="discriminator_column" (1)
type="discriminator_type" (2)
force="true|false" (3)
insert="true|false" (4)
formula="arbitrary sql expression" (5)
/>
鉴别器没有更新操作。