我正在尝试建立一个业务实体的模型,其中所说的业务可以有几个母公司和几个子公司。我不确定哪种关系合适,甚至不确定哪种映射合适。我熟悉SQL,但对Java ORM还是陌生的。
我的想法是,一个企业可以有很多或没有孩子,而一家企业可以有很多或没有父母。因此,我尝试将两者都设置为OneToMany,也都设置为OneToMany,两者均导致此错误:Illegal use of mappedBy on both sides of the relationship.
实现:
@Entity
public class Business{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "parentOrgs")
private Collection<Business> chlidOrgs;
@OneToMany(mappedBy = "chlidOrgs")
private Collection<Business> parentOrgs;
// --- Getters and setters below ---
我在这里不明白什么?任何和所有帮助非常感谢。
最佳答案
您当前的映射在语法上是错误的,因为关系的只有一方可以是拥有方。拥有方是mappedBy
属性的值定义的字段。可以从here找到更详细的说明。
同时从一侧删除mappedBy
不能解决问题,因为OneToMany
的对等必须是ManyToOne
。从两侧将其删除会给我们留下两个单域关联,这也不是必需的。
因为每个Business
可以有多个父级,并且似乎也可以直接导航到子级,所以解决方案是使用双向ManyToMany
:
@Entity
public class Business {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(mappedBy = "parents")
private Collection<Business> childrens;
@ManyToMany
private Collection<Business> parents;
}
从数据库的角度来看,这意味着以下表格:
Business(id)
Business_Business(childrens_id, parents_id)
必要时,可以通过JoinTable控制联接表和列的名称。