【问题标题】:JPA Persisting and fetching in @ManyToOne and @OneToManyJPA 在 @ManyToOne 和 @OneToMany 中持久化和获取
【发布时间】:2021-08-23 11:16:46
【问题描述】:

我正在尝试了解 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 实体获取 MobileNumber 实体
  • 如果我现在获取 Student 实体,我将设置填充相应的 MobileNumbers 对象

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

混乱的领域:

我也尝试了另一种方法 尝试坚持学生:

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)。

谢谢

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    当您与bidirectional one-to-many associations 打交道时,您始终必须使双方的关联保持同步。来自 Hibernate 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 bytecode enhancements 并且您之前的代码可以正常工作。

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多