我在hibernate上遇到了一个问题:
我有两类合作者和合作者,我希望他们之间有很多关系。
我的合作者课程:
@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;
在协作列表中插入两次相同的协作者时,出现以下错误:
javax.servlet.servletexception:org.hibernate.exception.constraintviolationexception:无法执行语句
或者更准确地说:
com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityconstraintviolationexception:键“uk\u obmdv02oey7264a085m7baqbo”的重复条目“2”
实际上,我不能给一个合作者分配两个不同的合作。
因此,我打印了mysql为n-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\u id,而且是collaborators\u id和collaboration\u id。
我怎么继续?
3条答案
按热度按时间j2cgzkjk1#
您需要添加jointable注解
46qrfjad2#
关于amer回答的补充信息:
sql语句
根据你的定义,你把
UNIQUE
约束collaborators_id
只有在你的Collaboration_Collaborator
table。您需要将约束扩展到两列。通常是这样写的:请检查适合您数据库的正确语法
日本邮政
正如埃默所说,你需要
@JoinTable
注解。顺便说一下,你可以放下targetEntity
:一些要点:
schema
是可选的,但我想把它,以避免混淆请注意订单
joinColumns
以及inverseJoinColumns
:joinColumns
指当前实体(Collaboration
在你的情况下)和inverseJoinColumns
指实体的Collaboration
与…有关我以为在table上
Collaboration
以及Collaborateur
,主键列为id
##杂项根据最佳实践,请避免混合语言:“collaborator”(英语)和“Collabour”(假设为法语)
dw1jzc5e3#
使用此联接表: