我使用hibernate将数据存储在MySQL数据库中。我现在想要存储公司和其中一个分支机构。
公司:
@Entity
@Table(name="company")
public class Company {
@Id
@GeneratedValue
@Column(name="id")
private int id;
@Column(name="name")
private String name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="company_branch_join",
joinColumns={@JoinColumn(name="company_id")},
inverseJoinColumns={@JoinColumn(name="branch_id")})
private Set<CompanyBranch> branches;
// Getters and setters...
}
分支:
@Entity
@Table(name="company_branch")
public class CompanyBranch {
@Id
@GeneratedValue
@Column(name="id")
private int id;
@Column(name="branch")
private String branch;
@ManyToMany(mappedBy="branches", cascade = CascadeType.ALL)
private Set<Company> companies;
// Getters and setters...
}
代码有效,我可以在连接表中插入数据。问题是关于分支的覆盖策略。我在数据库中的分支表已经填充了分支及其ID,因此我不想修改数据。但是,在公司插入时,与公司关联的分支将再次存储,并覆盖数据库中具有相同ID的数据。我该如何防止这种行为?
CompanyBranch cb1 = new CompanyBranch();
cb1.setId(1);
cb1.setBranch("Manufacturing");
CompanyBranch cb2 = new CompanyBranch();
cb2.setId(2);
cb2.setBranch("DONT-INSERT");
Company c = new Company();
c.setName("[Random-Company-Name]");
c.addBranch(cb1);
c.addBranch(cb2);
CompanyManager cm = new CompanyManagerImpl();
cm.saveCompany(c);
执行前的分支表如下所示:
| id | branch |
+----+----------------+
| 1 | Manufacturing |
| 2 | IT |
|... | ... |
表格不应该改变。但执行后它看起来像这样:
| id | branch |
+----+----------------+
| 1 | Manufacturing |
| 2 | DONT-INSERT |
|... | ... |
答案 0 :(得分:0)
不使用new
运算符创建新的分支实例,而是使用EntityManager.getReference()
检索对它们的引用,例如:
CompanyBranch cb1 = entityManager.getReference(CompanyBranch.class, 1);