JPA 2嵌入式XML映射使其与Hibernate Meta模型生成器一起工作

Ral*_*lph 7 java hibernate jpa

我想在Hibernate(版本1.1.1-Final)(在Spring应用程序中)使用JPA 2 Meta模型生成器.因为我使用Mapped Superclass作为所有实体的基础,并且这个类位于不同的jar中(供重用)我需要在XML中显式地映射这个类(仅用于元模型生成,因为它无需任何额外的工作准时的东西)---可能有人提示如何解决这个问题,但这不是问题.

此映射的超类(BusinessEntity)使用嵌入式类(BusinessId).

@SuppressWarnings("serial")
@MappedSuperclass
public abstract class BusinessEntity<T extends Serializable>
                      implements Serializable {
   @Id    
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id")
   private Long id;

   @Embedded
   private BusinessId<T> businessId;
 ...
}


@Embeddable
public class BusinessId<T> implements Serializable {
    @Column(nullable = false, unique = true, name = "businessId")
    private long businessId;
  ...
}
Run Code Online (Sandbox Code Playgroud)

但我没有得到映射与Generator一起工作:如果我使用它 orm.xml

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
    http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
    version="2.0">

    <mapped-superclass class="BusinessEntity"  
            access="FIELD">     
        <attributes>            
            <id name="id">
                <column nullable="false"/>
                <generated-value strategy="AUTO"/>              
            </id>
            <embedded name="businessId"/>
        </attributes>       
    </mapped-superclass>

    <embeddable class="BusinessId"
            access="FIELD">
        <attributes>
            <basic name="businessId">
                <column nullable="false" unique="true"/>
            </basic>
        </attributes>
    </embeddable>   
</entity-mappings>
Run Code Online (Sandbox Code Playgroud)

Generator创建这两个文件:

@StaticMetamodel(BusinessEntity.class)
public abstract class BusinessEntity_ {
    public static volatile SingularAttribute<BusinessEntity, Long> id;
}

@StaticMetamodel(BusinessId.class)
public abstract class BusinessId_ {
    public static volatile SingularAttribute<BusinessId, Long> businessId;
}
Run Code Online (Sandbox Code Playgroud)

你可以看到,BuinessEntity_中的嵌入式字段businessId丢失了!

当我更换<embedded name="businessId"/><basic name="businessId" />生成器创建这种不可编译的类(一般T不能得到解决).

@StaticMetamodel(BusinessEntity.class)
public abstract class BusinessEntity_ {

    public static volatile SingularAttribute<BusinessEntity, Long> id;
    public static volatile
           SingularAttribute<BusinessEntity, BusinessId<T>> businessId;
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何正确映射这些东西? - 或者总体上有更好的方法吗?

Rol*_*nbo 2

<basic> 不能用于复杂类型。您必须使用<嵌入>。当注释处理器应用于 orm.xml 时,我也遇到了一些缺点。

我不久前(2月18日)提交了这个问题:

http://opensource.atlassian.com/projects/hibernate/browse/METAGEN-57

还没有看过。似乎它没有受到太多关注,因为处理器正在处理注释。

我建议您也针对您的问题提交一个问题。