[英]Restrict HQL query to parent class only
我有兩個類A和B。B擴展了A。我想通過HQL類A更新。B被映射為每個具體類的表。 我無法控制這些映射。 因此,例如,我不能引入新的抽象類。
據我所知,“更新設置為attr1 = 1的A”將更新類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>
最后,我確實提出了以下解決方案。 我無法更改A或B類。我無法控制A.hbm或B.hbm,但是我可以在運行時對休眠配置進行猴子補丁。
我創建了一個新的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>
和猴子在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();
這樣,我就可以將缺失的概念注入原始的建模類中,並在休眠的多表批量操作期間防止使用臨時表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.