有没有一种有效的方法可以在没有注释的情况下分发 bean?

Is there an efficient way to distribute beans without annotations?

我有一些用 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 的项目中使用这个 class,所以我不想仅仅为了 class 而包含它es.

所以我考虑将这个 bean 分成两个 classes:一个只有字段和访问器,一个子 class 在访问器上带有 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 注释,我赞同。

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

如果您绝对必须为 JPA 使用基于注释的映射,这可能没有帮助,但如果您愿意使用它,您可以使用 xml 配置映射并且不包括 xml 用于与其他项目共享用户 class 的 jar 中的映射文件。

参见此处示例:

Persisting Entity Classes using XML in JPA

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

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

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

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