2017-09-20 69 views
2

我有兩個類A和B. B擴展A.我想通過HQL類A進行更新。B按每個具體類的表進行映射。我無法控制映射。所以我不能介紹一個新的抽象類。僅將HQL查詢限制到父類

「更新一組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

你使用的是'cascade = CascadeType.ALL',你能分享一下你的代碼,這樣我們可以瞭解更多嗎? –

+1

我添加了一些示例代碼。我認爲級聯只適用於協會而不是繼承。 – slowjack2k

+0

好吧,如果'B擴展A',那麼'更新A集attr1 = 1'會影響'B'並且它從'A'繼承,這就是繼承的工作原理。 –

回答

0

最後我想出了以下解決方案。我無法更改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(); 

這樣我就能夠注入原來的建模類中缺少的概念,並防止在休眠多表批量操作的臨時表的使用。