Spring JPA(Hibernate)自动将嵌套对象展平到单个表中

Mat*_*att 4 java spring hibernate jpa

我曾经知道如何做到这一点,但对于我的生活,我什至不记得要谷歌搜索什么!我有一堆 POJO,每个都有一些简单的字段(基元、字符串等),我只想将它们全部添加到父 POJO 中,并将整个批次一起存储为单个表中的一行(无需将每个字段从子 POJO 复制并复制到父 POJO 中)。我相信有一个注释,或者一个 Hibernate 转换器,我可以很容易地使用它来做到这一点?

例如,假设我有:

class A {
  Integer foo;
  String bar;
}
class B {
  Integer lol;
  String rofl;
}
Run Code Online (Sandbox Code Playgroud)

我想要一个父对象,如:

@Entity
class P {
  A a;
  B b;
}
Run Code Online (Sandbox Code Playgroud)

其中将有一个数据库模式 foo,bar,lol,rofl

非常感谢任何帮助!

Afr*_*idi 6

我认为您有 2 个类,具有一些共同的属性。所以你想创建另一个公共类,它应该与这些类一起使用,但不会映射到数据库中的任何特定表(我的意思是这个公共类将存在/将仅在应用程序级别处理)。像考虑 2 类学生和教师,具有一些共同属性,如姓名、性别等。所以现在可以将这些共同属性推送到一个共同类中,例如人类。因此,如果是这种情况,请执行以下操作:

@Embeddable
public class Human{
    private String name;
    private String gender;

    //Constructors, getters & setters
}
Run Code Online (Sandbox Code Playgroud)

现在创建一个特定的类,比如 Student

public class Student{

    @Embedded
    private Human human;
    private String rollNo;
    //....
    //Constructors, getters & setters
}
Run Code Online (Sandbox Code Playgroud)

等等对于教师类。

现在您可以保存这些条目,例如:

Human human = new Human();
human.setName("your-name");
//....

Student student = new Student();
student.setHuman(human);
student.setRollNo("343");
//....
Run Code Online (Sandbox Code Playgroud)

并保存它

studentRepository.save(student);
Run Code Online (Sandbox Code Playgroud)

所以在数据库中,只会为学生保存一条记录(姓名,性别,rollNo ...)。因为在这种情况下,Human 只是 Student 参数的组合,而不是一个实体。