【问题标题】:Persist an implementation which has no properties持久化没有属性的实现
【发布时间】:2015-01-05 20:09:45
【问题描述】:

鉴于以下类和接口,我想知道 JPa 如何处理它:

public interface Operator{
    public String getOperator();
}

让我们留下来,然后我有这个类的两个实现:

public class PlusOperation implements Operator, Serializable {
    public String getOperator(){
        return "+";
    }
}

还有:

public class MinusOperation implements Operator, Serializable {
    public String getOperator(){
        return "-";
    }
}

存在一个标记为@Entity 的类,它有一个属性Operator

@Entity
public class Function {
    @Id @GeneratedValue
    private Long id;
    private Operator operator;
    // Other methods & properties omitted for clarity
}

因此,在 Function 类中,它可以包含 PlusOperationMinusOperation 并且这些类都没有使用 @Entity 注释,因为它们没有任何需要持久化的属性,但它们各自不同。 JPA 如何处理这个问题?当持久化 Function 对象时,它是否会自动(并在“幕后”)使用正确的 Operation 实现标记 operator 属性?

【问题讨论】:

  • 实体是一种存储数据的方式。不是一种存储行为的方式。这完全是对 ORM 的滥用。不要。
  • 无论如何这都行不通,因为持久化操作符的唯一方法是序列化它,它不是可序列化的。
  • 鲍里斯,我同意,但这就是我必须解决的问题,所以问题仍然存在。 JB Nizet 我也实现了 Serializable 接口。
  • 在这种情况下只需阅读文档即可。这取决于继承模式的类型,但本质上特定的子类存储在表中并创建了正确的类型。例如,阅读Hibernate documentation 了解更多信息。

标签: java jpa entity


【解决方案1】:

只需添加一个 JPA AttributeConverter,它将“运算符”字段存储为字符串或整数。这样一来,这种其他类型(不是实体)是否没有任何自己的属性都无关紧要。然后,您的转换器负责决定持久化的内容以及检索方式。

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 2012-01-09
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多