kaneg 2010-12-17 16:22
浏览 211
已采纳

ORM 关联删除的一点疑惑

我刚开始试用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对象?

  • 写回答

5条回答 默认 最新

  • 华子82 2010-12-20 17:17
    关注

    那有没有办法建立严格的one-to-one的关系呢?
    答案是没有,在数据库中onetoone是通过外键约束和唯一性约束来确定的。
    其实更新的话,直接更新就好了,为什么要new了,即使要new,那你先remove下也是可以的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)