我有两个类A和B. B扩展A.我想通过HQL类A更新.B被映射为每个具体类的表。我无法控制映射。所以我不能引入新的抽象类。
“更新A set attr1 = 1”将根据我的知识更新A类和B类。是否可以通过HQL仅更新A类?我可以使用特制的HQL来阻止创建临时批量更新表吗?
public class A {
...
}
public class B extends A {
...
}
session.createQuery("Update A set attr1=1").executeUpdate();
<hibernate-mapping auto-import="false" default-
cascade="none" default-access="property" default-lazy="true">
<class name="A" table="a" abstract="false"
polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false">
<id name="id" column="id"/>
<property name="attr1" column="attr1" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
</class>
</hibernate-mapping>
<hibernate-mapping auto-import="false" default-cascade="none" default-access="property" default-lazy="true">
<union-subclass name="B" table="b" batch-size="20" extends="A" dynamic-update="false" dynamic-insert="false" select-before-update="false">
<property name="attr2" column="attr2" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
</union-subclass>
</hibernate-mapping>
答案 0 :(得分:0)
最后我确实提出了以下解决方案。我无法更改A类或B类。我无法控制A.hbm或B.hbm,但我可以在运行时进行补丁hibernate配置。
我创建了一个新类APatched:
class APatched extends A {
}
添加了一个APatched.hbm映射文件:
<hibernate-mapping auto-import="false" default-cascade="none" default-access="property" default-lazy="true">
<union-subclass name="APatched" table="not_existing" batch-size="20" extends="A" dynamic-update="false" dynamic-insert="false" select-before-update="false">
</union-subclass>
和Monkey在Hibernate启动之前修补了Hibernate配置:
configuration.addResource('APatched.hbm');
configuration.buildMappings();
PersistentClass toBePatched = configuration.getClassMapping(A.class.getName());
String oldTableName = toBePatched.getTable().getName();
toBePatched.getTable().setName(oldTableName + "_patched_not_existing");
toBePatched.getTable().setAbstract(true);
toBePatched.setAbstract(true);
PersistentClass patched = configuration.getClassMapping(APatched.class.getName());
patched.getTable().setName(oldTableName);
我将我的HQL更改为:
session.createQuery("Update APatched set attr1=1").executeUpdate();
这样我就可以在原始建模类中注入缺少的概念,并防止在hibernate多表批量操作期间使用临时表。