2012-07-04 61 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

老兄非常有帮助 –