Hibernate:从映射迁移到注释 - 是否可以混合使用hbm和注释?

时间:2012-07-04 16:27:14

标签: java spring hibernate annotations hibernate-mapping

我目前正将我的项目从Hibernate HBM Mappings迁移到Annotations。 就处理小班而言,一切都很简单。 但我有相同的大类,我尝试混合这个类的映射和注释。我读到这可以通过使用hibernate属性“hibernate.mapping.precedence”并将其设置为“class,hbm”而不是“hbm,class”来实现。 (见:In Hibernate: is it possible to mix Annotations and XML configuration for an Entity?

例如,我有以下Document类:

@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"/>

我的问题是: - 如果我把“class,hbm”作为优先级,那么我只有类Document中的注释 - 如果我把“hbm,class”,那么我只有我在hbm资源中的映射

如果有办法同时使用Annotations和HBM映射,有没有人知道呢?

由于

卡姆兰

PS:我使用:Hibernate 4.1.4和Spring Framework 3.1.1

1 个答案:

答案 0 :(得分:12)

您不能将它们混合到同一个班级。在section 1.2 of hibernate annotations结束时:

您可以将带注释的持久类和经典的hbm.cfg.xml声明与同一个SessionFactory混合使用。 但是,您不能多次声明一个类(无论是注释还是通过hbm.xml)。您不能在实体层次结构中混合配置策略(hbm与注释)。

为了简化从hbm文件到注释的迁移过程,配置机制检测注释和hbm文件之间的映射重复。然后,HBM文件优先于基于类的批注元数据 。您可以使用hibernate.mapping.precedence属性更改优先级。默认值为hbm,class,将其更改为类,当发生冲突时,hbm将优先考虑带注释的类而不是hbm文件。

使用注释和hbm文件两次声明一个类。因此,在类到类的基础上,一个将优先于另一个(类到类的基础意味着对于每个类,只使用hbm文件或注释)。