我如何支持 class 我不拥有的源代码的 jpa 数据库序列化?

How can I support jpa database serialization of a class who's source code I don't own?

如果我有一个实体,我想在 JPA2 中持久保存到数据库中,我只需添加 @Entity 注释,以及指定其关系的任何其他注释,等等。

我有几个 class 来自不属于我的依赖项,我想用它们来做这件事。我正在考虑一些想法,但我对其中任何一个都不是很满意。

  1. 创建一个 "empty" subclass,将所有调用委托给真正的 class。空的 subclass 将是持有配置注释的。我不确定这是否可行,因为我认为您需要向 superclass.

  2. 添加注释
  3. 使用属性转换器。如果我不关心使用我为关系导入的那个实体,这就可以了。我现在已经在为一些枚举做这个了。

  4. 我想我可以用 persistence.xml 配置它?但我想不惜一切代价避免这种情况。

再举一个我正在尝试做的例子,在 Spring 中,您通常通过在 bean 上放置 @Componeont 并用其他 JPA 注释装饰 class 来配置 bean。但是,如果您不拥有 class,Spring 有一个带有 @Bean 注释的简单机制,您可以在其中创建和配置 class 方法内部的 @Configuration class 调用以获取对该实体的引用。这样您就可以使用第三方库作为 beans 而无需访问源代码。

首先,无论你是否拥有class你想坚持的,你都不应该用@Entity来注释你的业务实体。这背后的原因很简单:数据库是一个 I/O 频道。 I/O频道是一个细节。您的业​​务逻辑应该独立于细节。

您应该将业务实体映射到 DTO,该 DTO 被传递到 DAO,然后 DAO 将其映射到数据库实体并保留它。不要相信我,this opinion actually stems from uncle Bob

所以答案是:将实体转换为DTO,将这个DTO传递给相应的DAO,DAO再次将其转换为某个数据库对象并持久化。

我最终使用 orm.xml 将 JPA 映射提供给 java 类 我不控制其源代码。