【问题标题】:Foreign Key sharing in HibernateHibernate 中的外键共享
【发布时间】:2017-04-26 18:28:22
【问题描述】:

我的数据库由两个表组成:OrganisationUser,在 ManyToOne 关系中,一个组织可以容纳许多用户。

在我分享我的问题之前,这里是我的实体:

@Entity
@Table(name = "organisation")
public class OrganisationEntity {
    @Id
    @Column(name = "orga_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    private String name;

    // Getters & Setters
}

-

@Entity
@Table(name = "\"user\"")
public class UserEntity {

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    private String email;

    @NotNull
    private String firstName;

    @NotNull
    private String lastName;

    @NotNull
    private String password;

    @ManyToOne(targetEntity = OrganisationEntity.class,cascade = CascadeType.ALL)
    @JoinColumn(name = "orga_id")
    private OrganisationEntity organisation;

    // Getters & Setters    
}

这是我的问题,当两个用户被分配一个具有相同名称的组织时,该组织在 Organisation 表中创建了两次,具有 2 个不同的 ID。如果新用户已经存在,我希望将其分配给新用户。

因此,如果用户 U1 和 U2 是使用名为 O1 的组织创建的,则两者应具有相同的 orga_id,并且应在数据库中仅创建一个组织条目。

如何实现?而我对Hibernate的理解还缺少什么?

应要求,这是我在用户注册时创建 UserEntity 的服务:

@Override
public UserInfo createUser(UserInfo newUser) {
    return mapper.map(userDao.save(mapper.map(newUser)));
}

我将带有Mapstruct 的对象映射到UserEntity 并将其发送到我的DAO 以便将其保存在我的数据库中。

【问题讨论】:

  • 能否请您发布创建/更新实体的代码?
  • 我已经添加了我的服务,如果这还不够,请告诉我。
  • 您提到您将两个用户分配给具有“相同”名称的组织,这让我相信您正在创建两个组织实例,并且您给两个用户提供了相同的名称,这不会不要以任何方式告诉hibernate它们实际上是同一个组织。您应该实例化 1 个组织并将其分配给两个用户。您可以在创建 OrganizationEntity 和 UserEntity 的位置发布代码吗?
  • 是的,因为组织的每个新对象在保存到数据库时都会创建具有不同 ID 的对象,因此它们将被视为不同的对象。您可以使用唯一约束来阻止相同的组织值再次保留在组织表中。

标签: java postgresql hibernate


【解决方案1】:

确保不要在每次创建新用户时都分配新的 Organisation 实例,而是首先按名称查询数据库中的现有组织,然后将生成的实体重新用于所有相关的用户(如果它已经存在)。

此外,为了正确起见,请考虑将UNIQUE 约束添加到organisation.name 列。

【讨论】:

  • 应该在哪里进行查询?在 DAO 中?我创建了一个检查并保存的方法,而不是“只是”保存到数据库中?
【解决方案2】:

由于您不希望为不同的用户使用不同的组织,最好从OrganisationEntityId 属性中删除@GeneratedValue(strategy = GenerationType.AUTO)。这将阻止在 DB 中创建更多的组织条目。

还要先获取 OrganisationEntity 对象并分配给 UserEntity

【讨论】:

  • 明白了,这样就根本不会创建条目了,是吗?
猜你喜欢
  • 2014-02-26
  • 2012-09-02
  • 2012-11-18
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多