![](/img/trans.png)
[英]Spring Hibernate uni-directional One-To-Many associations with good performance
[英]How to avoid insert and update queries in one-to-many uni-directional association
我在Employee
和Phone
实体之间有一个简单one-to-many
关系。
我这里有两个问题。
场景一:
@Entity
public class Employee {
@Id
@GeneratedValue
private long id;
private String firstName;
private String lastName;
private double salary;
@OneToMany
@JoinColumn(name = "parent_id", referencedColumnName = "id", insertable=false, updatable=false)
private List<Phone> phones = new ArrayList<Phone>(0);
// Setters & Getter methods
}
电话.java
@Entity
public class Phone {
@Id
private long id;
private String type;
private int areaCode;
private String phoneNumber;
// Setter & Getters
}
现在我创建了员工实例并向其中添加了 2 个电话。
Employee e1 = new Employee(10,"Bob", "Way",50000);
Phone p1 = new Phone(1,"home",613,"792-0000");
Phone p2 = new Phone(2,"work",613,"896-1234");
e1.addPhone(p1);
e1.addPhone(p2);
然后在休眠中,如果我使用以下代码:
session.save(e1);
session.save(p1);
session.save(p2);
或者如果我保存phone
然后employee
session.save(p1);
session.save(p2);
session.save(e1);
在这两种情况下,Hibernate 只运行insert
查询,没有任何update
查询,但foreign key
设置为 NULL。
mysql> select * from Phone;
+----+----------+-------------+------+-----------+
| id | areaCode | phoneNumber | type | parent_id |
+----+----------+-------------+------+-----------+
| 1 | 613 | 792-0000 | home | NULL |
| 2 | 613 | 896-1234 | work | NULL |
| 3 | 416 | 123-4444 | work | NULL |
+----+----------+-------------+------+-----------+
我怎样才能解决这个问题? 请让我知道我哪里出错了。
场景二:
现在,如果我对Employee
表中的@JoinColumn
进行如下更改:
@JoinColumn(name = "parent_id")
然后 Hibernate 生成**insert**
然后update
查询以正确映射外键。
Hibernate: insert into Employee (firstName, lastName, salary) values (?, ?, ?)
Hibernate: insert into Phone (areaCode, phoneNumber, type, id) values (?, ?, ?, ?)
Hibernate: insert into Phone (areaCode, phoneNumber, type, id) values (?, ?, ?, ?)
Hibernate: insert into Phone (areaCode, phoneNumber, type, id) values (?, ?, ?, ?)
Hibernate: update Phone set parent_id=? where id=?
Hibernate: update Phone set parent_id=? where id=?
当 Hibernate 在Employee
表上运行insert
,它会在那里获取employee id
,那么当 Hibernate 可以通过包含外键值在 Phone 表上运行单个插入查询时,为什么还要运行额外的update
查询?
我知道在update
查询中它添加了外键,但我想知道为什么这不是在电话表上的insert
查询中管理的。 你能解释一下吗?
场景3:
如果我这样说:
@JoinColumn(name = "OWNER_ID", insertable=false, updatable=false, nullable=false)
然后我得到以下异常:
Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value : onetomany.Phone._phones_OWNER_IDBackref
你有一个员工和一个电话。
您想将 insertable=false, updatable=false 添加到与 Phone 实体中的 Employee 实体的 @OneToMany 关系中,仅仅是因为创建或更新 Employee 不是 Phone 实体的责任。 这是反过来的。
@Entity
public class Employee {
@Id
@GeneratedValue
private long id;
private String firstName;
private String lastName;
private double salary;
@OneToMany(mappedBy="person", cascade=CascadeType.ALL)
private List<Phone> phones = new ArrayList<Phone>(0);
// Setters & Getter methods
}
@Entity
public class Phone {
@Id
private long id;
private String type;
private int areaCode;
private String phoneNumber;
@ManyToOne
@JoinColumn(name="PHONE_FK")
@Column(insertable=false, updatable=false)
private Employee employee;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.