【问题标题】:JPA ManyToMany relationship with unique attribute具有唯一属性的 JPA 多对多关系
【发布时间】:2016-07-31 11:47:59
【问题描述】:

我有一个从名为 Card 的类到名为 Color 的类的多对多关系。我正在使用 JPA 和 Hibernate。

Card.java

@Entity(name = "Cards")
public class Card
{
    @Id
    @Column(name = "card_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long cardId;

    @ManyToMany(cascade = CascadeType.ALL)
    private List<Color> colors;
}

颜色.java

@Entity(name = "Colors")
public class Color
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long colorId;

    @Column(unique = true)
    private String name;
}

但是如果我坚持一个卡片 java 会抛出一个异常,因为黑色已经包含在颜色中。

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Black' for key 'UK_sd7tby3rtx8snv2vlbmlmy69o'

但我希望 Colors.name 是唯一的,如果颜色已经持久化,JPA 应该搜索 Colors 并使用持久化的颜色。

【问题讨论】:

  • JPA 不会“如果颜色已经存在,则搜索颜色”,那是你的工作。 JPA 会坚持你给它的东西
  • 哦,好的。不知道这个事实:/
  • 我有同样的问题,我开始认为解决这个问题的唯一好方法是手动将连接表创建为实体,使用两个 OneToMany 关系,并使用 Hibernate 的事件系统来执行唯一的手动检查/修复,这是不幸的

标签: hibernate jpa many-to-many


【解决方案1】:

所以,我认为您需要OneToMany 关系并将新文件添加到Color 类,如下所示:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "card")
private List<Color> colors;

//Add to `Color`class
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "card_id", nullable = false)
private Card card;

【讨论】:

  • 我没说,但是一张卡片可以有更多的颜色。上下文是魔法卡。我不知道,如果你认识他们:)
猜你喜欢
  • 2015-08-08
  • 2016-02-11
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多