当前位置: 首页 > 知识库问答 >
问题:

在hibernate中使用复合主键持久保存1-M个实体

蒯宇定
2023-03-14

我有以下100万个实体的关系,指导学生。mentor有复合主键,我在student中使用它作为外键

@Entity
public class Mentor implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    private MentorPK id;
    private String email;
    @OneToMany(mappedBy="mentor")
    private Set<Student> students;

    public MentorPK getId() {
        return id;
    }            
    //getters and setters
}

@Embeddable
public class MentorPK implements Serializable {

    private static final long serialVersionUID = 1L;
    private String name;
    private String add;
    //getters and setters
    //override equals and hashcode
}


@Entity
public class Student implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;    

    @ManyToOne
    @MapsId("id")
    @JoinColumns({
        @JoinColumn(name="name_fk", referencedColumnName="name"),
        @JoinColumn(name="address_fk", referencedColumnName="address")
    })
    private Mentor mentor;

    //Getters and setters
}

然后,我将上面的内容保持为下面的内容,但在student表为空的地方,只有mentor被保持。

我如何坚持与学生的导师?

Set<Student> students = new HashSet<Student>();

Student s1 = new Student();
s1.setName("Student 1");

Student s2 = new Student();
s2.setName("Student 2");

students.add(s1);
students.add(s2);

MentorPK mpk = new MentorPK();
mpk.setAddress("C");
mpk.setName("D");

Mentor m = new Mentor();
m.setId(mpk);
m.setEmail("emaill");
m.setStudents(students);

studentManager.saveMentor(m);

共有1个答案

游炳
2023-03-14

尝试将students字段的注释更改为

@OneTomany(MappedBy=“Mentor”,cascade=CascadeType.Persist)

 类似资料:
  • 问题内容: 我想和Hibernate保持我的小动物园: 当我尝试保持动物园时,hibernate状态抱怨: 我知道-的属性,但这意味着,只有猫狗可以住在我的动物园里。 有没有办法用Hibernate来持久化具有多个实现的接口集合? 问题答案: 接口上不支持JPA批注。从 Java Persistence with Hibernate (p.210): 请注意,JPA规范在接口上不支持任何映射注释!

  • 我在使用复合主键的hibernate实体集时遇到了问题。 我们的应用程序中有一个概念“Target”。目标id应该是其他三个表(实体)主id的组合。目标也有一个int标记。员工应该有一系列目标。SQL如下所示: 这个SQL工作正常,它允许我每个role_id(员工)多个目标,只要应用程序和项目分类不同。 这是目标ID类 这是目标类 这是employee类,我想在其中为每个员工存储一组目标。 通过h

  • 我使用spring boot 2,我的一些实体有复合键 当我尝试保存一个实体时,我会得到这个错误 无法转换请求元素:org.springframework.beans.conversionNotSupportedException:无法将类型“java.lang.integer”的属性值转换为属性“samping”所需的类型“com.lcm.model.samplingspk”;嵌套异常为java

  • 我为这个特殊的问题找了很多,但我没有找到任何具体的解决办法。我在一个表中有一个复合主键,这个复合主键的一个字段是另一个表的复合主键的一部分。您可以说这个特定的字段是第二个表中的外键,但是在表定义中没有定义任何独占外键约束。对于第一个表中的每个rec,第二个表中可能有多条记录。我试图使用SPringBoot-JPA-Hibernate实现这一点,但无法实现。有人能帮我吗。以下是德泰:- 我有一个US

  • 我有以下实体: 我第一次使用复合主键,所以我不知道它应该如何工作。问题可能来自定义。第二个参数应该表示ID。但是没有一个主键,而是有两个主键,所以我认为我应该将id类添加到id参数中,但这不起作用。如何使用带有CrudRepository的IdClass键保存具有复合主实体?

  • 我猜这是一个教义错误(我在JIRA问题跟踪器上提交了一个问题),但万一只是用户错误,我决定在这里发布它。 使用由2个外键和一个元数据字段组成的复合主键在联接表中持久化实体集合在某些情况下会失败。代码是以这里的指令为基础的:条令文件 调试日志: 失败:当外键%1在集合中的项之间相同,并且外键%2小于任何现有外键%2时,工作单元尝试插入现有实体,但不对新实体进行操作。 > 示例:GPA“add val