我有3个类,一个超类和两个子类。每个子类都有另一个子类的集合,我想映射它们之间的一对多关系。我的超类是person,子类称为referrer和broker。我想要表达的关系是,一个推荐人可以拥有多个经纪人,而且一个经纪人可以拥有多个推荐人。
@Component
@Entity
@Table(name="Referrer")
@PrimaryKeyJoinColumn(name="rowID")
public class Referrer extends Person implements Serializable{
private static final long serialVersionUID = 972571370198603227L;
@Column(name="rowId")
private String referrerID;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn
private List<Broker> brokers = new ArrayList<Broker>();
经纪人看起来像这样:
@Component
@Entity
@Table(name="Broker")
@PrimaryKeyJoinColumn(name="rowID")
public class Broker extends Person implements Serializable {
private static final long serialVersionUID = 5648239413711716027L;
@Column(name="AdminID", nullable=true)
private String adminID;
@Column
private boolean isAdmin = false;
@OneToMany(cascade=CascadeType.ALL, mappedBy="referrer")
private List<Referrer> referrers = new ArrayList<Referrer>();
Broker的主键应该是一个名为rowID的字段,该字段包含在Person超类中。
我真的被卡住了,所以任何帮助都会非常感激。
答案 0 :(得分:2)
最后,您所拥有的是ManyToMany
关系。除了一个问题,你使用连接表吗?看起来就像这样。 Basicaly你尝试的是这个:
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
name = "jointablename",
joinColumns = @JoinColumn(name = "FlexRowId"),
inverseJoinColumns = @JoinColumn(name = "FlexRowId")
)
private List<Referrer> referrers = new ArrayList<Referrer>();
基本上这就是你需要在两个实体中添加的内容。可能你可以省略@PrimaryKeyJoinColumn(name="FlexRowID")
。但我不得不承认,我不知道如何使用基本相同的列进行双面映射。所以请随时告诉我这件事。
答案 1 :(得分:1)
如果Broker的主键是Person,那么我的方法就是这个
在Person和Broker之间定义一对一的连接关系,每个都有自己的表
在Broker的外部id生成器中使用Person的PK(使其成为双向的,以便级联可以正常工作)
对Referrer(它有自己的表)重复相同的操作
引入另一个具有两列(当然具有不同名称)的中间表,两个表(Broker和Referrer)的复合PK。对Broker(和Referrer)使用多对多关系,并在中间表上的各个PK列上加入。