我面临着hibernate的一个问题:
我有两个类协作者和协作,我想在它们之间建立一个ManyToMany关系。
我的合作者课:
@Entity
@Table(name = "Collaborateur")
public class Collaborateur {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private Integer id;
private String lastname;
private String firstname;
private String email;我的合作班:
@Entity
@Table(name = "Collaboration")
public class Collaboration {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private Integer id;
private String nameCollaboration;
@ManyToMany(targetEntity=Collaborator.class ,fetch = FetchType.EAGER)
private List<Collaborator> collaborators;当我在列表协作中插入两次相同的协作者时,我有以下错误:
org.hibernate.exception.ConstraintViolationException:无法执行语句
或者更准确地说:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:“UK_obmdv02oey7264a085m7baqbo”的重复条目“2”
事实上,这是说我不能为一个协作者分配两个不同的协作。
因此,我打印了mysql为n关系创建的表,我有以下内容:
CREATE TABLE `Collaboration_Collaborator` (
`Collaboration_id` int(11) NOT NULL,
`collaborators_id` int(11) NOT NULL,
UNIQUE KEY `UK_obmdv02oey7264a085m7baqbo` (`collaborators_id`),
KEY `FKlrsiogs304faydykt1xtgpk9k` (`Collaboration_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;因此,我需要指定我的唯一键不仅是collaborators_id,而且是collaborators_id和collaboration_id。
我该怎么做?
发布于 2018-01-07 17:37:45
您需要添加可连接的注释
@ManyToMany(targetEntity=Collaborator.class ,fetch = FetchType.EAGER)
@JoinTable
private List<Collaborator> collaborators;发布于 2018-01-07 23:58:55
为了提供更多关于Amer的答案的信息:
SQL
根据您的定义,您只在UNIQUE表中对collaborators_id设置了一个Collaboration_Collaborator约束。您需要将约束扩展到两列。它通常写得像
CONSTRAINT "UK_obmdv02oey7264a085m7baqbo" UNIQUE(Collaboration_id, collaborators_id)请检查适合数据库的正确语法。
JPA
正如Amer所提到的,您将需要@JoinTable注释。顺便说一句,您可以删除targetEntity
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(schema = "myschema", name = "Collaboration_Collaborator",
joinColumns = {
@JoinColumn(name = "Collaboration_id", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "collaborators_id", referencedColumnName = "id")})
private List<Collaborator> collaborators;以下几点:
schema是可选的,但我想用它来避免混淆。joinColumns和inverseJoinColumns的顺序:joinColumns是指当前实体(在您的情况下是Collaboration),inverseJoinColumns是指与Collaboration相关的实体Collaboration和Collaborateur中,主键列是id其他
根据最佳做法,请避免混合语言:“合作者”(英语)和“协作者”(假设为法语)
发布于 2018-01-08 08:41:55
使用此联接表:
CREATE TABLE `Collaboration_Collaborator` (
`Collaboration_id` int(11) NOT NULL,
`collaborators_id` int(11) NOT NULL,
PRIMARY KEY `UK_obmdv02oey7264a085m7baqbo` (`collaborators_id`, `Collaboration_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;https://stackoverflow.com/questions/48139751
复制相似问题