簡體   English   中英

JPA 在@ManyToOne 和@OneToMany 中持久化和獲取

[英]JPA Persisting and fetching in @ManyToOne and @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 實體獲取 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)。

謝謝

當您處理雙向的一對多關聯時,您必須始終保持關聯在雙方同步。 來自 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 字節碼增強功能,並且您之前的代碼可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM