我有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是否安全?我想了解所涉及的风险。
提前致谢。
答案 0 :(得分:0)
嗯,JPA实体的等于和哈希码是一个老问题,现在我们仍然面对项目。
我建议你看看stackoverflow answer。
基本上,文章所要求的是不依赖于数据库生成的字段为你的equals和hashcode(也就是实体id),因为在持久化之前需要在内存中处理数据(因为它在你的case),那么,你仍然没有在数据库中生成一个标识符。
有些人建议您使用标识符来控制自己的等号和哈希码,(但不要去除PK,因为它对索引数据库很重要。)
但是,好吧,请阅读我指出的答案,并就如何正确解决问题得出自己的结论!
干杯,尼古拉斯