是否有一种有效的方法来分发没有注释的bean?

时间:2015-09-24 14:35:10

标签: java jpa annotations code-reuse reusability

我有一些使用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();
   }
}

不幸的是,在大多数情况下,将JPA注释放在访问者身上seems是一种沮丧的做法,而我是第二次。

你能建议任何更清洁的解决方案吗?

2 个答案:

答案 0 :(得分:2)

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

参见此处的示例:

Persisting Entity Classes using XML in JPA

答案 1 :(得分:1)

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

  • 带注释的类可以扩展未注释的类,或
  • 带注释和未注释的类可以扩展共同的超类,或
  • 带注释和未注释的类可以实现公共接口。

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

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