我刚开始试用ORM,上层采用的是JPA,实现是用hibernate. 在测试中我发现了一个比较疑惑的地方,请大家帮忙看看:
实体 User.java
[code="java"]
import javax.persistence.*;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@OneToOne(cascade = CascadeType.ALL)
Email email;
public User() {
}
public User(String name) {
this.name = name;
}
public Email getEmail() {
return email;
}
public void setEmail(Email email) {
this.email = email;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", email=" + email +
'}';
}
}
[/code]
Email.java
[code="java"]
public class Email {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;
String address;
public Email() {
}
public Email(String email) {
this.address = email;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Email{" +
"id=" + id +
", address='" + address + '\'' +
'}';
}
}
[/code]
测试代码:
[code="java"]
@Test
public void testAddEmail() {
User user = new User("kane");
Email email = new Email("aaa@b.com");
user.setEmail(email);
um.add(user);
User user1 = um.find(user.getId());
user1.setEmail(new Email("bbb@b.com"));
um.update(user1);
}
[/code]
上述代码中,我先创建一个user对象和一个email对象(aaa@b.com),并将该email对象赋给该user对象。这时查看数据库中的数据是这样的:
[code="java"]
table user:
id name email_id
1 kane 2
table email:
id address
1 aaa@b.com
[/code]
之后我重新获取该user对象,并赋予另一个新的email对象(bbb@b.com)。我本来以为老的email将被删除,数据库中的数据应该变成:
[code="java"]
table user:
id name email_id
1 kane 2
table email:
id address
2 bbb@b.com
[/code]
但实际上那条老的email数据还存在,数据库中数据是这样的:
[code="java"]
table user:
id name email_id
1 kane 2
table email:
id address
1 aaa@b.com
2 bbb@b.com
[/code]
请问各位,这是ORM本来就这样设计的吗?如果我需要将老的数据自动删除,有什么办法吗?还是说需要手动删除老的email对象?