2012-07-04 62 views
9

我目前正在將我的項目從Hibernate HBM Mappings遷移到註釋。 就我處理小班而言,一切都很簡單。 但我有相同的巨大類,我嘗試混合這個類的映射和註釋。我讀過這可以通過使用hibernate屬性「hibernate.mapping.precedence」並將其設置爲「class,hbm」而不是「hbm,class」。 (參見:In Hibernate: is it possible to mix Annotations and XML configuration for an Entity?Hibernate:從映射遷移到註釋 - 可以混合hbm和註釋嗎?

例如我有以下的文檔類:

@Entity 
@Table(name="DOCUMENT") 
public class Document { 
    @Column(name="DESCRIPTION") 
    private String description; 
} 

及以下Document.hbm.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping> 
    <class name="Document" table="DOCUMENT" > 
    <id name="id" column="DOCUMENT_ID" type="long" /> 
    </class> 
</hibernate-mapping> 

在我的hibernate.cfg.xml文件我把:

<property name="hibernate.mapping.precedence">class, hbm</property> 
<mapping class="Document"/> 
<mapping resource="Document.hbm.xml"/> 

我的問題是: - 如果我把「類,HBM 「的優先順序,然後我只有我的批註在類文檔 - 如果我把」hbm,類「,那麼我只有我的映射在hbm資源

有沒有人知道如果有一種方法來同時具有註釋和HBM映射?

感謝

卡姆蘭

PS:我用:Hibernate的4.1.4和Spring框架3.1.1

回答

11

不能爲同一類混合。在section 1.2 of hibernate annotations的末尾:

您可以將帶註釋的持久類和經典的hbm.cfg.xml聲明與相同的SessionFactory混合使用。 但是,您可以不多次聲明(無論是註釋還是通過hbm.xml)。您不能在實體層次結構中混合配置策略(hbm vs註釋)。

爲了簡化從hbm文件到註釋的遷移過程,配置機制檢測註釋和hbm文件之間的映射重複。然後HBM文件優先於註釋元數據,按類別爲基礎。您可以使用hibernate.mapping.precedence屬性更改優先級。缺省值是hbm,class,將其更改爲class,當發生衝突時,hbm將優先於hbm文件註釋的類。

使用註釋和hbm文件聲明一個類兩次。因此,在班級與班級的基礎上,班級與班級的優先順序將相互優先(班級與班級的基礎意味着每班只有hbm文件或註釋被使用)。

+0

親愛的巴勃羅,非常感謝這個澄清。 ! – marcam

+0

老兄非常有幫助 –