我有一些使用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是一种沮丧的做法,而我是第二次。
你能建议任何更清洁的解决方案吗?
答案 0 :(得分:2)
如果您必须使用基于注释的JPA映射,这可能没有用,但是如果您对它开放,则可以使用xml配置映射,而不是在用于共享的jar中包含xml映射文件带有其他项目的User类。
参见此处的示例:
答案 1 :(得分:1)
如果您坚持使用注释来定义实体映射,那么您的实体类无法避免依赖于JPA。如果您必须提供表示相同数据的非JPA依赖类,并且您希望能够以多态方式处理不同的表示,那么您的选项是有限的:
在任何一种情况下,实体类都可以为实体属性提供自己的,带注释的成员变量,但在所有情况下,这样做意味着这两个类为实体属性提供单独的存储。这在第一个替代方案中可能有点浪费,可能在第二个替代方案中,但它是唯一可以在不将整个层次结构绑定到JPA的情况下注释成员变量的方法。
如果你想进入这个大方向,那么无论是注释成员变量还是访问者方法,我都建议使用接口而不是类继承。使用多态性接口可以更好地模拟您描述的现实(某些User
是实体,但其他不是实体),它不会干扰您可能需要的任何继承层次结构,如果您注释成员变量,则它会避免重复存储。