java - jpa:具有自引用和非抽象父类(super class)的继承

标签 java hibernate jpa persistence javabeans

在我当前的项目中,我有一个如下所示的继承结构:

@Entity
@Table(name="groups")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorValue("G")
@DiscriminatorColumn(name="group_type")
public class Group{  //some annotations removed 
    private Long id;
    private String name;
    private Set<Subject> subjects;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="parent_group_id")
    private Group parent;            #####  tree parent  ####
@OneToMany(cascade=CascadeType.ALL, mappedBy="parent")
    private Set<Group> subGroups;    ##### tree children #####
        ...
}

我的Group对象可以通过包含其他 Group 的列表来具有类似树的结构。对象。 由于某些组有点特殊,因此有第二个类扩展了该类:

   @Entity
   @DiscriminatorValue("C")
   @Table(name="fix_groups")
   public class FixGroup extends Group{
        private Layout lay;
        private Set<Person> instr;
            ...
    }

我尝试使用连接的多表方法(如下所述: http://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Joined.2C_Multiple_Table_Inheritance ),但它似乎不适用于像 Group 这样的非抽象父类(super class)。 ! 我收到以下异常:

Caused by: java.lang.ClassCastException: org.hibernate.mapping.JoinedSubclass 
cannot be cast to org.hibernate.mapping.RootClass

除了声明 Group 之外还有其他解决方案吗?作为抽象并创建一个新类 Group2那只是延伸它吗? 如果我这样做,这个 self 引用Set<Group> subGroups会吗?仍然会造成问题吗?

最佳答案

当子类中的 ID 已映射到父类(在本例中为 Group)中时,我可以通过在子类中设置 ID 来导致此错误。例如在父类中:

@Entity
@Table(name="groups")
@Inheritance(strategy=InheritanceType.JOINED)
public class Group {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
...

然后在子类中设置 id,如下所示:

@Entity
@Table(name="sub_groups")
public class SubGroup extends Group {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
...

在这种情况下,Group不需要是抽象的,但是你不能在子类上定义id。

此外,作为旁注,如果您使用具有“join”类型继承的 Hibernate,则不需要鉴别器列和值。 Hibernate 仅在使用单个表时才使用这些。请引用这篇文章以获取更多信息:

Hibernate 4: persisting InheritanceType.JOINED discriminator column values

关于java - jpa:具有自引用和非抽象父类(super class)的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13708417/

相关文章:

java - JPA Repository : javax. persistence.NonUniqueResultException: 结果返回多个元素

java - 使用 Hibernate 实现具有内容比较的版本控制功能的最佳方法是什么?

java - 具有静态方法的泛型

java - 多次询问苏权限

java - Servlet 抛出 java.lang.NullPointerException

java - Hibernate Annotation下使用命名查询有什么好处

java - 为什么 H2 在自动创建模式之前尝试在数据库中加载数据?

java - 无法确定用于对齐成绩簿程序的列的空间

java - 'withIngestionTimestamps()' 在 Hazelcast Jet Pipeline 中到底有什么用?

java - Hibernate 是否通过 Getter 的结果识别变化?