我是JPA的相对新手,并且我已经读过书籍(使用Hibernate的Java Persistence,Pro JPA 2-掌握Java Persistence API),完成了google搜索,但无法提出解决方案出现以下情况。
我有一个称为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;
}
所以我找不到适合我情况的任何东西。 我希望我对此解释得足够好,以使人们能够理解。 有谁知道该怎么做,这不是一个完整的和完全的hack :-) 感谢您的帮助。
答案 0 :(得分:0)
以下注释应该起作用:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
继承类型TABLE_PER_CLASS
使继承实体创建自己的表,并且您还需要告诉History
也是Entity
,即使它没有自己的表。