繁体   English   中英

如何避免一对多单向关联中的插入和更新查询

[英]How to avoid insert and update queries in one-to-many uni-directional association

我在EmployeePhone实体之间有一个简单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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM