【发布时间】:2018-11-18 15:45:13
【问题描述】:
我是 JPA 的新手,我读过书籍(Java Persistence with Hibernate、Pro JPA 2 - Mastering the Java Persistence API),做过谷歌搜索,但我还没有找到解决方案到以下情况。
我有一个名为 History 的基类,它包含将类的数据成员存储到数据库所需的所有持久信息。但是,该类有一个抽象方法,需要在派生类中重写。派生类没有自己的任何持久性信息。它们的存在仅出于两个原因:
- 唯一实现基中定义的抽象方法 历史课
- 将数据保存到自己的表中
下面的代码应该可以清楚地说明这一点。
@??? What annotation should I use here?
public abstract class History
{
@Id @GeneratedValue
private int id; // primary key
@Lob @Column(columnDefinition="mediumtext", length=65535)
protected String string; // string containing history
public abstract String foo();
}
@Entity
@Table(name="derived_history_1")
public class Derived1 extends History
{
public String foo()
{
return "Hello";
}
}
@Entity
@Table(name="derived_history_2")
public class Derived2 extends History
{
public String foo()
{
return "World";
}
}
我认为@Inheritance(strategy=InheritanceType.JOINED) 没有意义,因为派生类中没有继承任何需要持久化的内容。
我尝试了@MappedSuperclass,但是当派生类是另一个类的数据成员时,CascadeType.PERSIST 和 CascadeType.MERGE 不起作用。例如,
@Entity
@Table(name="part")
public class Part
{
...
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, optional=false, fetch=FetchType.LAZY)
@JoinColumn(name="history_id") // foreign key into history_part table
protected Derived1 history;
}
所以我找不到任何适合我的情况的方法。 我希望我解释得足够好,人们可以理解。 有谁知道如何做到这一点,这不是一个完整的黑客:-) 感谢您的帮助。
【问题讨论】:
-
JPA Inheritance的可能重复
-
@MappedSuperclass似乎是你想要的。如果如您所说,这不起作用,那么您需要就此提出问题。 -
我发现这篇文章证实了我的怀疑,即 MappedSuperClass 是实现设计的正确方法。 vladmihalcea.com/… 但我有一个不同的问题,即类没有被持久化,这是一个不同的问题。