有没有一种有效的方法可以在没有注释的情况下分发 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 中的映射文件。
参见此处示例:
如果您坚持使用注解来定义您的实体映射,那么您的实体 classes 无法避免依赖于 JPA。如果您必须提供表示相同数据的非 JPA 依赖的 classes,并且如果您希望能够以多态方式处理不同的表示,那么您的选择是有限的:
- 带注释的class可以扩展未带注释的,或者
- 带注释和不带注释的 classes 可以扩展一个公共的 superclass 或
- 带注释和不带注释的 classes 可以实现通用接口。
在任何这些情况下,实体 class 可以为实体属性提供自己的、带注释的成员变量,但在所有情况下,这样做意味着两个 classes 提供单独的实体属性的存储。这在第一个替代方案中有点浪费,在第二个替代方案中可能也是如此,但这是您可以在不将整个层次结构绑定到 JPA 的情况下注释成员变量的唯一方法。
如果您想朝这个总体方向前进,那么我建议您使用接口而不是 class 继承,无论您是注释成员变量还是访问器方法。使用接口进行多态性可以更好地模拟您所描述的现实(一些 User
是实体,而另一些则不是),它不会干扰您可能想要的任何继承层次结构,并且如果您注释成员变量,则它可以避免重复存储。
我有一些用 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 中的映射文件。
参见此处示例:
如果您坚持使用注解来定义您的实体映射,那么您的实体 classes 无法避免依赖于 JPA。如果您必须提供表示相同数据的非 JPA 依赖的 classes,并且如果您希望能够以多态方式处理不同的表示,那么您的选择是有限的:
- 带注释的class可以扩展未带注释的,或者
- 带注释和不带注释的 classes 可以扩展一个公共的 superclass 或
- 带注释和不带注释的 classes 可以实现通用接口。
在任何这些情况下,实体 class 可以为实体属性提供自己的、带注释的成员变量,但在所有情况下,这样做意味着两个 classes 提供单独的实体属性的存储。这在第一个替代方案中有点浪费,在第二个替代方案中可能也是如此,但这是您可以在不将整个层次结构绑定到 JPA 的情况下注释成员变量的唯一方法。
如果您想朝这个总体方向前进,那么我建议您使用接口而不是 class 继承,无论您是注释成员变量还是访问器方法。使用接口进行多态性可以更好地模拟您所描述的现实(一些 User
是实体,而另一些则不是),它不会干扰您可能想要的任何继承层次结构,并且如果您注释成员变量,则它可以避免重复存储。