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

Hibernate不允许非唯一记录,即使unique为false

凌展
2023-03-14

我有一个包含用户及其密码的数据库。当我启动应用程序时,我会创建一些具有角色的用户,并将其存储到数据库中。我的用户实体:

@Entity
@Table(name = "USERS")
public class User {
    @Id
    @Column(name = "USERNAME",  nullable = false,  unique = true)
    private String username;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    @Column(name = "ENABLED", nullable = false)
    private boolean enabled = true;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
    private Set<UserRole> userRole = new HashSet<>();
...getters and setters

和用户角色实体

@Entity
@Table(name = "user_roles")
public class UserRole {


    @Id
    @Column(name = "ROLE")
    private String role;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "USERNAME")
    private User user;

默认情况下,列角色是唯一的=false,但当我添加userA与角色:管理员,用户,然后userB与角色:用户,记录userB-用户覆盖记录userA-用户。有人能指出我的错误是什么吗?

我正在使用hibernate 5 spring 5

共有2个答案

怀刚毅
2023-03-14

如果您为userB保存了一个角色,因为您在UserRole和CascadeType中有User的映射。ALL,保存后,在数据库中重写角色user的USERNAME。你真的需要用户在UserRole映射?如果没有必要,我认为你应该把它从UserRole实体中删除,只留下角色的名称。例如,可以将角色映射到用户喜欢的

    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "username"))
    @Column(name = "role")
    @ElementCollection(fetch = FetchType.EAGER)
    private Set<Role> roles;
笪智志
2023-03-14

根据定义,ID是唯一的。这就是唯一识别实体的方法。

 类似资料:
  • null ___________________________________________________________________________________________________________________________________________________________________________________________________

  • 问题内容: 我有Foo模型,其中有栏杆。bar字段应该是唯一的,但允许为空,这意味着如果bar字段为,我想允许多个记录,但如果不是,则值必须是唯一的。 这是我的模型: 这是该表的相应SQL: 当使用管理界面在bar为null的情况下创建多个1个foo对象时,它给我一个错误:“此Bar的Foo已经存在。” 但是,当我插入数据库(PostgreSQL)时: 这样做很好,它允许我插入1条以上且bar为n

  • 问题内容: 编辑:当我说“ SQL Server”时,我实际上是在谈论Management Studio。 抱歉,这令人困惑。 哦,我讨厌这种事情发生。昨天我在使用SQL Server,并尝试使用PIVOT命令来弄清楚它是如何工作的。因此,我创建了一个包含四列的新表,第一列的前几行将具有相同的值。 我在第一行,第一列中添加了“ value1”,然后按回车键–因为还没有添加任何键或约束,它使我可以向

  • 我正在使用jOOQ为我的数据库表生成POJO。这很有效。 我有一个带有主键()和唯一键()的表。更新记录时,jOOQ使用主键。 我想通过使用唯一键而不是主键来更新记录。 https://github.com/jOOQ/jOOQ/blob/master/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java 本质上,我想用另一个键(第二个参

  • 问题内容: 我有一个存储产品代码的字段。该代码是唯一的,但是某些产品根本没有代码。我无法发明代码,因为它们是提供商代码。 在MySQL中这种约束可能吗? 我是一个存储过程和触发器的菜鸟,所以如果解决方案涉及其中之一,请耐心等待。 更新:列不为空。这就是为什么我无法做到这一点。 问题答案: 是的,您可以这样做。参见MySQL参考(版本5.5)。 UNIQUE索引会创建约束,以使索引中的所有值都必须不

  • 我昨天从http://developer.android.com/sdk/index.html安装了ADT捆绑包,我正在遵循一个基本的Hello World教程。我创建了一个新的Android应用程序项目,其中包含名为的空白活动。生成的项目有一个空的文件夹和空的文件夹。文件夹中有一个文件,但它没有引用。这是SDK管理器说我已经安装的 Android SDK工具v 22.6 Android SDK平