【问题标题】:Hibernate Annotation/XML workaroundHibernate Annotation/XML 解决方法
【发布时间】:2014-12-12 18:27:26
【问题描述】:

我在 hibernate 中开发一个项目,其中有注释和 xml 映射实体。

这里是设置,Entity/Class A 是基于注解的。

Class A

@Id
long id;

我需要一个 A 类的集合,它只能通过 XML 配置进行映射。我们不能为我知道的给定实体混合注释和 xml。

但是我是否可以只创建一个包装类,将其命名为 X,并使用我将放在 A 中的集合 xml 配置为 X 创建一个相应的 XML 映射?所以我们有:

Class A

@Id
long id;

Object X;

还有一个 X.hbm.xml 文件。请注意,此文件将包含映射以制定表 B 中的列集合,该列由 A 的主键映射,该主键是 B 中的外键。所以我猜它实际上必须引用表 A 和 B。

这种解决方法是否可行?似乎是一个很长的镜头......

【问题讨论】:

    标签: java xml hibernate jpa orm


    【解决方案1】:

    您可以尝试映射文件(我用它们重新定义了“外部”实体的某些属性)

    persistence.xml

    <persistence-unit name="yourPersistenceUnit" transaction-type="RESOURCE_LOCAL">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <mapping-file>META-INF/orm-custom.xml</mapping-file>
    

    orm-custom.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 orm_2_0.xsd"
            version="2.0">
    
        <entity class="your.Entity">
            <attributes>
                <one-to-many name="attributes" fetch="LAZY"/>
                <one-to-many name="answers" fetch="LAZY"/>
            </attributes>
        </entity>
    </entity-mappings>
    

    【讨论】:

    • 我有点困惑,所以你们的解决方案允许我们通过 XML 覆盖注解?所以我可以有一个包含所有注释的类,称为“your.Entity”,并且可以通过这个 orm-custom.xml 文件覆盖这个类的一个字段/属性?
    • @James,您最好参考文档。事实上,我按照你的要求做了。我在外部 jar 中有一个实体,该实体使用 EAGER 作为其列表。为了覆盖它,我使用了 orm-custom.xml
    • @James "EJB3 中元数据的主要目标是注释,但是 EJB3 规范提供了一种通过 XML 部署描述符覆盖或替换注释定义的元数据的方法。在当前版本中,只有纯 EJB3 注释支持覆盖。如果您希望在某些实体中使用 Hibernate 特定功能,则必须使用注释或回退到 hbm 文件。您当然可以混合和匹配带注释的实体和 hbm 文件中描述的实体。"