首页 > 解决方案 > Spring中使用外键的OneToOne关系

问题描述

如何在hibernate中为下表实现一对一的双向关系:

create table persons(
                       person_id varchar(20) not null,
                       first_name varchar(20) not null,
                       last_name varchar(20) not null,
                       primary key client_fk (person_id)
);
create table roles(
                     person_id varchar(20) not null,
                     role_name varchar(20) not null,
                     role_description varchar(20) not null,
                     constraint role_person foreign key role_fk (person_id) references person(person_id)
);

我想在PersonEntityRoleEntity之间建立关系。

我尝试了许多不同的设置,但没有成功,例如:

@Entity(name = "persons")
@Table(name = "persons")
public class PersonEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "person_id")
    int personId;
    @Column(name = "first_name")
    String firstName;
    @Column(name = "last_name")
    String lastName;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "person_id")
    private RoleEntity role;

@Entity(name = "roles")
@Table(name = "roles")
public class RoleEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "person_id")
    int personId;
    @OneToOne
    @JoinColumn(name = "person_id")
    private PersonEntity person;
    @Column(name = "role_name")
    String roleName;

我的目标是创建两个CrudRepositoresRolesRepositoryPersonsRepository),以便检索所有具有指定角色的人员和所有具有指定人员的角色。

如何实现?

标签: javahibernateforeign-keysone-to-one

解决方案


我的目标是创建两个 CrudRepositores(RolesRepository 和 PersonsRepository),以便检索所有具有指定角色的人员和所有具有指定人员的角色。

这意味着一个角色属于多个人。这使得这种关系绝对不是@OneToOne。所以你没有走正确的路。

如果一个人只有 1 个角色,但 1 个角色属于多个人,那么您必须使用

  1. PersonEntity 类 -> @ManyToOneRoleEntity role
  2. RoleEntity 类 -> @OneToManyList<PersonEntity> personEntities

如果一个人有多个角色并且每个角色也属于其他人,那么你需要

  1. PersonEntity 类 -> @ManyToManyList<RoleEntity> roleEntities
  2. RoleEntity 类 -> @ManyToManyList<PersonEntity> personEntities

如果您的结构具有正确的逻辑,那么您的 crud 存储库将起作用。如果没有,您将面临问题。通过试图强制@OneToOne 建立一个不是@OneToOne 的关系就像黑客攻击并试图利用休眠的某些功能来实现你想要的。我认为这不会很好。


推荐阅读