【问题标题】:Is there an efficient way to distribute beans without annotations?有没有一种有效的方法来分发没有注释的 bean?
【发布时间】:2015-09-24 14:35:09
【问题描述】:

我有一些用 JPA 注释的 bean 来处理持久性映射。

这是一个例子:

import javax.persistence.Id;

public class User{
   @Id
   private String id;

   public String getId(){
       return id;
   }

   public void setId(String id){
       this.id = id;
   }
}

现在我想在另一个不需要依赖 javax.persistence 的项目中使用这个类,所以我宁愿不只为这些类包含它。

所以我想把这个 bean 分成两个类:一个只有字段和访问器,一个子类在访问器上带有 JPA 注释。喜欢:

public class User{
   private String id;

   public String getId(){
       return id;
   }

   public void setId(String id){
       this.id = id;
   }
}

import javax.persistence.Id;

public class UserEntity extends User{

   @Override
   @Id
   public String getId(){
       return super.getId();
   }
}

不幸的是,seems 在大多数情况下,将 JPA 注释放在访问器上是一种不鼓励的做法,我对此表示赞同。

您能推荐任何更清洁的解决方案吗?

【问题讨论】:

    标签: java jpa annotations code-reuse reusability


    【解决方案1】:

    如果您绝对必须为 JPA 使用基于注释的映射,这可能没有帮助,但如果您对它持开放态度,则可以使用 xml 配置映射,而不是将 xml 映射文件包含在您用来共享的 jar 中User 类与其他项目。

    参见此处的示例:

    Persisting Entity Classes using XML in JPA

    【讨论】:

    • 这是基于 XML 的实体映射的一个很好的用例。
    【解决方案2】:

    如果你坚持使用注解来定义你的实体映射,那么你的实体类就无法避免依赖于 JPA。如果您必须提供表示相同数据的非 JPA 相关类,并且希望能够以多态方式处理不同的表示,那么您的选择是有限的:

    • 带注释的类可以扩展未注释的类,或者
    • 注释类和非注释类可以扩展一个公共超类,或者
    • 带注释和不带注释的类可以实现一个通用接口。

    在任何这些情况下,实体类都可以为实体属性提供自己的、带注释的成员变量,但在所有情况下,这样做意味着这两个类为实体属性提供了单独的存储。这在第一个备选方案中有点浪费,在第二个备选方案中可能是这样,但这是您可以在不将整个层次结构与 JPA 绑定的情况下注释成员变量的唯一方法。

    如果您想朝着这个大方向前进,那么无论您是注释成员变量还是访问器方法,我都建议您使用接口而不是类继承。使用多态接口更好地模拟您描述的现实(一些Users 是实体,但其他不是),它不会干扰您可能想要的任何继承层次结构,并且如果您注释成员变量,那么它可以避免重复存储。

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多