JPA中的一对多映射 - 由于hashcode / equals而面临问题

时间:2016-11-21 11:38:05

标签: java jpa

我有Compnay和Branch与一对多的关系

公司

@Entity 
@Table(name = "tbl_company")
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "company_id")
    private long companyId;

    ...

    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL, fetch = LAZY)
    private Set<Branch> branches;

   ...
}  

科:

@Entity
@Table(name = "tbl_branch")
public class Branch {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "branch_id")
    private long branchId;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="branchcompany_id")
    private Company company;


    @Override
    public int hashCode() {
       int hash = 3;
       hash = 59 * hash + (int) (this.branchId ^ (this.branchId >>> 32));
       return hash;
    }

    @Override
    public boolean equals(Object obj) {
       if (this == obj) {
           return true;
       }
       if (obj == null) {
           return false;
       }
       if (getClass() != obj.getClass()) {
           return false;
       }
       final Branch other = (Branch) obj;
       if (this.branchId != other.branchId) {
           return false;
       }
       return true;
    }

}

我得到了JSON,用于添加没有ID的公司+分支(我的等号和散列基于ID)。当我尝试将2个分支附加到公司的分支集合时,我只得到1个分支,因为默认情况下ID为0。

{
"companyName": "Cynosure Company",
"address": "Nashik",
"branches": [
  {
    "branchName": "my branch"
  },
  {
    "branchName": "my second branch"
  }
 ]
}

有些选择可能会 1)转换成列表(在我的情况下不可能) 2)保存公司后单独保存分支(无级联) - 不可取

否则 3)删除equals / hashcode - 目前没有分离和重新附加。有多个用户使用该网站并同时发出POST / PUT请求,但单个用户没有多个会话。那么选择3是否安全?我想了解所涉及的风险。

提前致谢。

1 个答案:

答案 0 :(得分:0)

嗯,JPA实体的等于和哈希码是一个老问题,现在我们仍然面对项目。

我建议你看看stackoverflow answer

基本上,文章所要求的是不依赖于数据库生成的字段为你的equals和hashcode(也就是实体id),因为在持久化之前需要在内存中处理数据(因为它在你的case),那么,你仍然没有在数据库中生成一个标识符。

有些人建议您使用标识符来控制自己的等号和哈希码,(但不要去除PK,因为它对索引数据库很重要。)

但是,好吧,请阅读我指出的答案,并就如何正确解决问题得出自己的结论!

干杯,尼古拉斯