Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种没有注释的有效方法来分发bean?_Java_Jpa_Annotations_Code Reuse_Reusability - Fatal编程技术网

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

Java 有没有一种没有注释的有效方法来分发bean?,java,jpa,annotations,code-reuse,reusability,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; } } 现在我想在另一个项目中使用这个类,在这个项目中,我不

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

不幸的是,在大多数情况下,在访问器上放置JPA注释是一种不鼓励的做法,我支持这种做法


您能推荐更干净的解决方案吗?

如果您必须使用基于注释的JPA映射,那么这可能没有帮助,但是如果您愿意使用它,您可以使用xml配置映射,而不将xml映射文件包含在与其他项目共享用户类的jar中

请参见此处的示例:


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

  • 注释类可以扩展非注释类,或者
  • 注释类和非注释类可以扩展公共超类,或者
  • 注释类和非注释类可以实现公共接口
在任何情况下,实体类都可以为实体属性提供自己的带注释的成员变量,但在所有情况下,这样做意味着两个类为实体属性提供单独的存储。这在第一种选择中有点浪费,在第二种选择中也可能有点浪费,但这是唯一一种可以在不将整个层次结构绑定到JPA的情况下注释成员变量的方法


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

这是基于XML的实体映射的一个很好的用例。
import javax.persistence.Id;

public class UserEntity extends User{

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