Hibernate JPA具有唯一属性的多个关系

Hibernate JPA具有唯一属性的多个关系,hibernate,jpa,many-to-many,Hibernate,Jpa,Many To Many,我有很多关系,从一个叫做Card的类到一个叫做Color的类。我正在使用JPA和Hibernate java @Entity(name = "Cards") public class Card { @Id @Column(name = "card_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private long cardId; @ManyToMany(cascade = Casca

我有很多关系,从一个叫做Card的类到一个叫做Color的类。我正在使用JPA和Hibernate

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会抛出一个异常,因为黑色已经包含在颜色中

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

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

因此,我认为您需要
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;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“card”)
私有列表颜色;
//添加到'Color'类
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“card\u id”,nullable=false)
私人卡;

因此,我认为您需要
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;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“card”)
私有列表颜色;
//添加到'Color'类
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“card\u id”,nullable=false)
私人卡;

JPA不会“如果颜色已经存在,则搜索颜色”,这是您的工作。JPA是为了坚持你给它的东西。不知道这个事实:/I也有同样的问题,我开始认为解决这个问题的唯一好方法是手动创建一个实体的联接表,使用两个OneToMany关系,并使用Hibernate的事件系统手动执行唯一的检查/修复,不幸的是JPA不会“如果颜色已经持久化,则搜索颜色”,那是你的工作。JPA是为了坚持你给它的东西。不知道这个事实:/I我也有同样的问题,我开始认为解决这个问题的唯一好方法是手动创建一个实体的联接表,使用两个OneToMany关系,并使用Hibernate的事件系统手动执行唯一的检查/修复,不幸的是我没有提到,但一张卡可以有更多的颜色。上下文是魔术卡。我不知道,如果你认识的话:)我没提过,但是一张卡片可以有更多的颜色。上下文是魔术卡。我不知道,如果你认识他们:)