【问题标题】:JPA Annotations with inheritance具有继承的 JPA 注释
【发布时间】:2015-10-01 10:35:42
【问题描述】:

我正在从事 JPA 项目,我需要你的帮助。

我有两个类,“Person”和“Leader”,它们继承自 Person。

@Entity   
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)    
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)  
    private Long id;


    @Column(unique = true)    
    private String personId;

}

@Entity
public class Leader extends Person implements Serializable {

    private List < Person > listTeam;

    public void addPersonInTeam(Person e) {

        listTeam.add(e);
    }
}

我的问题是,在班级领导者的私有列表 listTeam 之前,我是否需要有 JPA 注释 @OneToMany 或其他东西?

非常感谢

【问题讨论】:

  • 我建议阅读这个stackoverflow.com/questions/2883033/…,因为我看到的问题比列表上缺少注释要多得多。如果没有帮助,请留言。
  • 你的意思是我需要把 Person 作为抽象?或添加@MappedSuperClass?但在这种情况下,人不会是持久的,尽管我需要它是持久的。非常感谢您的帮助。
  • 是的,您当然需要 OneToMany 或 ManyToMany 注释。 Hibernate 不会猜测关联对您来说是什么。
  • 您确定要扩展吗?在您的情况下,也许一些简单的布尔值isLeader 就足够了?
  • 所以你建议我只有包含布尔 isLeader 和 List 的类 Person 如果该人不是领导者,则应该为空?

标签: java hibernate jpa


【解决方案1】:

您需要指定两个类之间的映射,因为对于 Hibernate,关联在此处不相关,您必须在两边都使用注释,我想您需要在此处使用 OneToMany 映射:

这是您要搜索的映射:

在 Person 类中:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(unique = true)
    private String personId;

    @ManyToOne
    @JoinColumn(name="leader_id")
    private Leader leader;
    //getter and setter

}

在领导者类中:

@Entity
public class Leader extends Person implements Serializable {

    @OneToMany(mappedBy = "leader")
    private List <Person> listTeam;
    //getter and setter

    public void addPersonInTeam(Person e) {
        listTeam.add(e);
    }
}

有关更多信息,您可以查看以下链接:

注意:

我在Person 类中没有看到字段personId 的使用,没有必要使用两个不同的ID。

编辑:

回答您的问题:

  1. @JoinColumn(name="leader_id") 不是强制性的,但它用于指定外键名称。
  2. 如果关系是ManyToMany,则mappedBy属性用于指定关系的所有者,您可以查看this answer了解更多详细信息。

【讨论】:

  • 非常感谢@chsdk,现在更清楚了,但我还有其他问题:1- @JoinColumn(name="leader_id") 是强制性的吗?为什么 ? 2-如果关系是ManyToMany(一个人可以是许多领导团队的一部分),那么mappedBy边不是那么重要吗?无论是在 Person 端还是 Leader 端都应该起作用(但性能不会一样)对吧? 3- Person 不是抽象类这一事实是绝对可以的,对吧?非常非常感谢
  • 非常感谢 chsdk,mappedBy 的所有者方面非常清楚,但是您说“如果关系是 ManyToMany,那么 mappedBy 属性是可选的”?据我了解,在多对多的情况下,哪一方是所有者并不重要,但我需要选择一方对吗?我的意思是,如果我只在两边留下@ManyToMany 而不使用mappedBy,那它就不是双向链接了,对吧?
  • 对不起,我不认为这是可选的,我的错,你必须指定关系的所有者,我编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
相关资源
最近更新 更多