【问题标题】:How to create a hibernate entity from an external api class?如何从外部 api 类创建休眠实体?
【发布时间】:2019-02-21 17:43:36
【问题描述】:

我正在编写游戏引擎 API,因此我无法直接访问类,也无法添加休眠注释(@Entity、@Table 等),但我必须将 API 中的此类保存在我的对象(表)。我怎样才能做到这一点?扩展 API 对象并使用休眠注释创建新对象或将此对象解析为字符串?有任何想法吗?

类例如我的意思:

@Entity
@Table(name="users")
public class User {

    @Id
    @Column(name="id")
    private int id;

    @Column(name="location")
    private Location locationOfPlayer; // - this is the class from API

}

【问题讨论】:

标签: java hibernate orm


【解决方案1】:

您可以为此使用映射文件,您需要在 persistence.xml 中定义该文件:

<persistence version="2.0" ...>
   <persistence-unit name="database">
       <mapping-file>mapping.xml</mapping-file>
       ...
   </persistence-unit>
</persistence>

在您的映射文件中,您甚至可以为第三方类定义 ORM 映射:

<entity-mappings version="1.0" 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_1_0.xsd">
    <package>thirdparty</package>
    <entity class="Location" name="Location">
        ...
    </entity>
</entity-mappings>

【讨论】:

  • 国际海事组织的正确答案。如果 JPA 规范本身允许处理此类情况,那么为什么要引入其他内容。 JPA 2.1 规范的第 12 章 Object/Relational Mapping Descriptor 中有更多信息
【解决方案2】:

做到这一点的唯一现实/好方法是Instrumentation
您可能想要创建并应用 Java Agent,它在加载时转换所需的类,添加 JPA 注释。这基本上是字节码修改。

例如,请参阅ClassFileTransformer

【讨论】:

  • 这很有趣,不知道有这个。现在实际上来说,这是比为所需实体创建包装类更好的解决方案。我认为这不是很可升级,因为它非常依赖于版本。
  • @Shawn 好吧,这是一个基于意见的决定。就我个人而言,我不喜欢用“包装器”类污染我的包。想想看,每次你需要在 API 类(普通类)和你的服务/存储库之间进行交互时,你都需要包装它。也许你可以集中它,也许不能。老实说,ClassFileTransformer 方式对我更有吸引力。我可以将其作为单独的模块/项目进行维护。版本相关是什么意思?
  • @Shawn 我还要补充一点,谈到性能和内存优化,这种方法是不可战胜的。
  • 谢谢,这是有道理的。我将不得不在我的一个项目中尝试它并更加熟悉这个 API。
  • @Shawn 试试看。这是一个非常强大的机制。你可以用它做美丽的事情。只需搜索“加载时间编织 - 面向方面的编程”
【解决方案3】:

基本上,您将不得不在实体类中复制数据:即创建具有相似字段的实体并将其持久化,而不是使用 API 类。这样做的缺点是您需要手动使数据模型保持最新,但优点是 API 中的更改不会直接破坏您的数据库代码。

复制完数据后,您可以使用映射框架(我更喜欢 Mapstruct,因为它在编译时进行映射,但 Orika 等运行时库也非常适合此任务)

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多