首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注解ManyToMany唯一密钥问题

注解ManyToMany唯一密钥问题
EN

Stack Overflow用户
提问于 2018-01-07 17:30:53
回答 3查看 50关注 0票数 0

我面临着hibernate的一个问题:

我有两个类协作者和协作,我想在它们之间建立一个ManyToMany关系。

我的合作者课:

代码语言:javascript
复制
@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;

我的合作班:

代码语言:javascript
复制
@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关系创建的表,我有以下内容:

代码语言:javascript
复制
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。

我该怎么做?

EN

回答 3

Stack Overflow用户

发布于 2018-01-07 17:37:45

您需要添加可连接的注释

代码语言:javascript
复制
@ManyToMany(targetEntity=Collaborator.class ,fetch = FetchType.EAGER)
@JoinTable
private List<Collaborator> collaborators;
票数 0
EN

Stack Overflow用户

发布于 2018-01-07 23:58:55

为了提供更多关于Amer的答案的信息:

SQL

根据您的定义,您只在UNIQUE表中对collaborators_id设置了一个Collaboration_Collaborator约束。您需要将约束扩展到两列。它通常写得像

代码语言:javascript
复制
CONSTRAINT "UK_obmdv02oey7264a085m7baqbo" UNIQUE(Collaboration_id, collaborators_id)

请检查适合数据库的正确语法。

JPA

正如Amer所提到的,您将需要@JoinTable注释。顺便说一句,您可以删除targetEntity

代码语言:javascript
复制
@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;

以下几点:

  1. schema是可选的,但我想用它来避免混淆。
  2. 请注意joinColumnsinverseJoinColumns的顺序:joinColumns是指当前实体(在您的情况下是Collaboration),inverseJoinColumns是指与Collaboration相关的实体
  3. 我假设在表CollaborationCollaborateur中,主键列是id

其他

根据最佳做法,请避免混合语言:“合作者”(英语)和“协作者”(假设为法语)

票数 0
EN

Stack Overflow用户

发布于 2018-01-08 08:41:55

使用此联接表:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48139751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档