首页 > 解决方案 > JPA 在 @ManyToOne 和 @OneToMany 中持久化和获取

问题描述

我正在尝试了解 JPA OneToMany/ManyToOne。截至目前,正是试图理解 mappedBy 和 JoinColumn。

我的实体:


import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import javax.persistence.*;

@Entity
@Table(name = "mobile_number")
@Data
@ToString(exclude = "student")
public class MobileNumber {

    @Id
    private String number;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "student_id")
    private Student student;
}
package com.example.demo.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.persistence.*;
import java.util.Set;

@Entity
@Table(name = "student")
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "student")
    private Set<MobileNumber> mobileNumberSet;


}

我目前的理解:

在这里,MobileNumber 是关系的拥有方。据我了解,我可以使用 MobileNumber 实体持久化/获取学生实体。

所以如果我简单地写下面的代码:|

 MobileNumber mn = new MobileNumber();
      mn.setNumber("some_number");

      Student s = new Student();
      s.setName("TestUser");
      
      mn.setStudent(s);
      mobileNumberRepository.save(mn);

如果以上几点是正确的,请帮助我

混乱的领域:

我尝试了另一种方法,也尝试坚持 Student :

Student s = new Student();
        s.setName("TestUser");
        MobileNumber mn = new MobileNumber();
        mn.setNumber("some_number");

        Set<MobileNumber> set = new HashSet<>();
        set.add(mn);
        s.setMobileNumberSet(set);

        studentRepository.save(s);

现在我不明白,这以意想不到的方式表现。我根本看不到 MobileNumber 得到持久化。

任何人都可以帮助我如何从这一端获取和持久化子实体(MobileNumber)。

谢谢

标签: javahibernatejpa

解决方案


当您处理双向的一对多关联时,您必须始终保持关联在双方同步。从休眠 ORM 文档:

每当形成双向关联时,应用程序开发人员必须确保双方始终保持同步。

您的代码应如下所示:

        Student s = new Student();
        s.setName("TestUser");
        MobileNumber mn = new MobileNumber();
        mn.setNumber("some_number");
        mn.setStudent(s);

        Set<MobileNumber> set = new HashSet<>();
        set.add(mn);
        s.setMobileNumberSet(set);

        studentRepository.save(s);

请注意,您也可以将该属性设置hibernate.enhancer.enableAssociationManagement为 true。这将启用 Hibernate ORM字节码增强功能,并且您之前的代码可以正常工作。


推荐阅读