有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate一对一映射。从依赖表中删除行

表格:学生、地址 大学生ADDR_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;
}
:
:

它在创建和更新案例中工作良好

如果我将学生的地址更改为新地址,那么它将创建一个新行,但不会删除旧地址的行。 如果我将地址设置为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);

我把一切都安排好了。需要做哪些额外/不同的工作。这里是否适用反向法


共 (2) 个答案

  1. # 1 楼答案

    在我的例子中,一对一删除级联不起作用,因为没有使用事务。在这里它工作得很好

    @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();
    
  2. # 2 楼答案

    如果orphanremoval = true对您来说足够的话,您应该使用它

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