java注解有许多独特的关键问题

xbp102n0  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(266)

我在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。
我怎么继续?

j2cgzkjk

j2cgzkjk1#

您需要添加jointable注解

@ManyToMany(targetEntity=Collaborator.class ,fetch = FetchType.EAGER)
@JoinTable
private List<Collaborator> collaborators;
46qrfjad

46qrfjad2#

关于amer回答的补充信息:

sql语句

根据你的定义,你把 UNIQUE 约束 collaborators_id 只有在你的 Collaboration_Collaborator table。您需要将约束扩展到两列。通常是这样写的:

CONSTRAINT "UK_obmdv02oey7264a085m7baqbo" UNIQUE(Collaboration_id, collaborators_id)

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

日本邮政

正如埃默所说,你需要 @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 与…有关
我以为在table上 Collaboration 以及 Collaborateur ,主键列为 id ##杂项
根据最佳实践,请避免混合语言:“collaborator”(英语)和“Collabour”(假设为法语)

dw1jzc5e

dw1jzc5e3#

使用此联接表:

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;

相关问题