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

Hibernate多对多关系创建不必要的唯一约束

桑鸿志
2023-03-14

一天中的好时光!我在使用Hibernate创建多对多关系时遇到一些问题。它在联接表中创建唯一约束:

“uk_bapa98k9j6y66sqniad6k680l”唯一约束,btree(用户id)

因此,我只能在此表中为特定用户设置一行,尝试插入具有相同user_id的另一行会导致错误:

错误组织。冬眠发动机jdbc。spi。SqlExceptionHelper-错误:重复的键值违反了唯一约束“uk_bapa98k9j6y66sqniad6k680l”Пббббббббббб:键(用户id)=(1)已存在

如何禁止Hibernate在此表中添加唯一约束?

@Entity
@Table(name="Projects", schema="public")
public class Project implements Serializable {
...
    @Id
    @GenericGenerator(name="increment", strategy="org.hibernate.id.IncrementGenerator")
    @GeneratedValue(generator="increment")
    @Column(name="project_id")
    public Long getId() {
        return this.id;
    }
...
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="project_users", joinColumns=@JoinColumn(name="projects_id"), inverseJoinColumns=@JoinColumn(name="users_id"))
    @ElementCollection(targetClass=User.class)
    public Set<User> getUsers()
    {
        return users;
    }


@Entity
@Table(name="Users")

public class User implements Serializable {
...
    @Id
    @GenericGenerator(name="increment", strategy="org.hibernate.id.IncrementGenerator")
    @GeneratedValue(generator="increment")
    @Column(name="user_id")
    public Long getId() {
        return this.id;
    }
...
    @ManyToMany(mappedBy="users")
    public Set<Project> getProjects()
    {
        return projects;
    }

共有2个答案

闾丘淇
2023-03-14

使用@Id注释实体字段时,该Id必须是唯一的。用户也是如此。不管您的多对多关系如何,用户id都应该具有唯一性约束。

劳研
2023-03-14

您不应该将@ElementCollection用于实体集合,它用于可嵌入或简单类型的集合。

 类似资料:
  • 我在hibernate中搜索建立关系的各种可能性,遇到了下面的代码片段

  • 用户表结构:用户 id、名称、用户名、密码、创建时间、更新时间 文章表结构:文章 id、标题、内容、创建时间、更新时间 关系表:文章\用户 id、文章id、用户id处于活动状态、创建时间、更新时间 标签 id、名称、用户id、创建时间、更新时间 透视表项目用户与标记的关系。表:文章\用户\标签 标签号,物品号,用户号 我想连接这些表,以便可以像这样或类似的格式访问 并且应该能够创建/更新smth,

  • 我正在学习冬眠,只是有点困惑。

  • 我正在尝试使用Hibernate/Jpa建立一对多关系。 当前我遇到以下异常: 退款交易。java这是父类 ItemRefundDetail.java这是子类。 我知道我在@OneToMany或@manytone注释中犯了一些错误。 更新:我在db、refund_transaction和item_refund_detail中只有2个表。我没有任何名为refund_transaction_item_

  • 问题内容: 我有实体类A和C。它们正在映射表tblA和tblC,并且它们之间具有多对多关系,而tblB可以在它们之间进行映射。tblB包含A_ID,C_ID和SetDate,最后一个是它的设置日期,因此是关系的属性。我的问题是,如何最好地映射此属性?目前,它们尚未映射,如下所示: A: C: 我应该如何从中获取tblB.SetDate? 干杯 问题答案: 据我所知, 不可能 以这种方式映射它,您必

  • 我有两个类:< code>User和< code>UserProfile。 用户类别: 用户配置文件类: 当我使用此代码时,我在具有多对多关系的表用户配置文件中获得重复的实体。我使用 函数来保存对象。我做错了什么? 然后我删除 cascadeType,出现错误:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。 Hibernate日志: