Hibernate:对多对多插入禁止更新

时间:2014-08-09 21:05:18

标签: sql hibernate

问题

我使用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    |
|... | ...            |

1 个答案:

答案 0 :(得分:0)

不使用new运算符创建新的分支实例,而是使用EntityManager.getReference()检索对它们的引用,例如:

CompanyBranch cb1 = entityManager.getReference(CompanyBranch.class, 1);