我使用了“每个层次结构的类策略”来映射 Hibernate 中的以下类层次结构。
我有Item作为抽象类。具体如下: Book Journal 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 在调用更新方法时更改鉴别器列?