【问题标题】:JPA - What Annotation to use for a base classJPA - 用于基类的注释
【发布时间】:2018-11-18 15:45:13
【问题描述】:

我是 JPA 的新手,我读过书籍(Java Persistence with Hibernate、Pro JPA 2 - Mastering the Java Persistence API),做过谷歌搜索,但我还没有找到解决方案到以下情况。

我有一个名为 History 的基类,它包含将类的数据成员存储到数据库所需的所有持久信息。但是,该类有一个抽象方法,需要在派生类中重写。派生类没有自己的任何持久性信息。它们的存在仅出于两个原因:

  1. 唯一实现基中定义的抽象方法 历史课
  2. 将数据保存到自己的表中

下面的代码应该可以清楚地说明这一点。

@??? 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/… 但我有一个不同的问题,即类没有被持久化,这是一个不同的问题。

标签: java hibernate jpa


【解决方案1】:

以下注释应该可以工作:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

继承类型TABLE_PER_CLASS使继承实体创建自己的表,你还需要告诉History也是一个Entity,即使它没有自己的表。

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 2013-11-05
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2018-10-18
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多