休眠一对一映射。从依赖表中删除行

Posted

技术标签:

【中文标题】休眠一对一映射。从依赖表中删除行【英文标题】:Hibernate one to one mapping. Delete row from dependent table 【发布时间】:2017-05-23 03:43:03 【问题描述】:

表格:学生、地址 Student.ADDR_ID 列映射到 Address.ID

我的学生课中的注释如下

public class Student 

String name, surname;
int rollNumber;
Teacher classTeacher;
Address address;

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="ADDR_ID")
public Address getAddress() 
    return address;

:
:

在创建和更新案例中运行良好。

如果我将 Student 的地址更改为新地址,则会创建一个新行,但不会删除旧地址的行。 如果我将地址设置为 null 仍然不会删除

例如

 Student s1 = session.get(Student.class, 24);
 Address addr = new Address();
 session.save(addr);
 s1.setAddress(addr);
 session.save(s1);

 or

 Student s1 = session.get(Student.class, 24);
 s1.setAddress(null);

我已设置级联所有。需要做哪些额外/不同的事情。 Inverse 在这里适用吗?

【问题讨论】:

你试过 orphanRemoval="true" 吗? @Susie 成功了。你能不能把它作为单独的答案发布,所以我可以接受它并给你信用 如果你想让学生成为家长,你必须将外键放入地址表。此映射需要双向 @OneToOne 关联。父级可以通过级联将其生命周期传播到子级。 @Lele 可能我已经按照 Susie 所说的方式回答了这个问题。你还会等苏西吗? @ShafinMahmud 是的。因为她是第一个回答的。还有一个精确的。 【参考方案1】:

你应该使用orphanremoval = true,如果这对你来说足够了

@OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="ADDR_ID")
public Address getAddress() 

【讨论】:

orphanremoval=true 就足够了【参考方案2】:

在我的情况下,一对一删除级联不起作用,因为未使用事务。在这里它工作正常......

@Entity
@Table(name="student")
public class Student 
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @Column(name="student_name",length=60)
    private String studentName;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "address_id")
    private Address address;

    //Setter Getter


@Entity
@Table(name = "address_table")
public class Address 

    @Id
    @Column(name = "address_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long addressId;

    @Column(name = "street_name", length = 50)
    private String street;

    @Column(name = "city_name", length = 50)
    private String city;

    //Setter Getter



Student student = session.get(Student.class, 1L);
session.beginTransaction();
session.delete(employee);
session.getTransaction().commit();

【讨论】:

以上是关于休眠一对一映射。从依赖表中删除行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用注释在休眠中进行一对一映射

一对多和一对多连续映射的休眠条件查询 - 表或视图不存在

休眠延迟加载不适用于多对一映射

休眠一对多映射注释问题

数据库和 Hibernate 一对一的最佳方法

休眠中的异常(一对一)