【问题标题】:Bidirectional mapping and saving multiple entities双向映射和保存多个实体
【发布时间】:2020-02-21 12:12:16
【问题描述】:

我有两个表 StudentAddress 表。我想要它们之间的双向映射。我想要的第二件事是当地址在学生班级中时,地址会自动从学生实体添加。

通过这段代码实现双向映射:

@Entity
class Student {

    @Id
    private long id;

    @OneToMany(cascade = CascadeType.ALL,mappedBy = "student")
    private Address address;
}

@Entity
class Address {

    @Id
    private long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "student_id")
    private Student student;
}

第二种情况是通过这段代码实现的,但是没有做双向映射:

@Entity
class Student {

    @Id
    private long id;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "student_id",referencedColumnName = "id")
    private Address address;
}

@Entity
class Address {

    @Id
    private long id;
}

有没有办法获得双向映射并添加学生的地址?

【问题讨论】:

    标签: java spring hibernate spring-boot jpa


    【解决方案1】:

    Student 中有@OneToMany Address。这意味着您告诉 Hibernate,一个学生可能有 许多 个地址。

    应该是这样的:

    class Student {
        @OneToMany(cascade = CascadeType.ALL,mappedBy = "student")
        private List<Address> addressList;
    }
    

    由于AddressStudent 之间的关系是多对一的,那么一个地址可能只有一个学生。

    class Address {
        @ManyToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "student_id")
        private Student student;
    }
    

    考虑到这一点,您的save 实现可能如下:

    Student student = new Student();
    Address address = new Address();
    
    address.setStudent(student);
    student.setAddressList(Collections.singletonList(student));
    
    studentRepository.save(student);
    //addressRepository.save(address); or use AddressRepository
    

    【讨论】:

    • 为什么我们需要设置student到address,然后再次寻址student。只能使用“student.setAddressList(Collections.singletonList(student))”保存地址。
    【解决方案2】:

    首先,您应该在@OneToMany 端使用集合:

    @OneToMany(cascade = CascadeType.ALL,mappedBy = "student")
    private List<Address> address;
    

    我想要的第二件事是当地址在学生班级时,地址会自动从学生实体添加。

    您只能使用bytecode enhancement 来实现它(参见双向关联管理部分)。 hibernate.enhancer.enableAssociationManagement 选项负责。

    在运行时字节码增强中启用关联管理功能,仅在一侧更改时自动同步双向关联

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 2012-05-25
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多