注释ManyToMany唯一的关键问题

时间:2018-01-07 17:30:54

标签: java mysql hibernate

我遇到了hibernate的问题:

我有两个班级合作者和合作,我希望他们之间有 ManyToMany 关系。

我的Collaborator课程:

data()

我的协作班:

$('#Up').click(function() {
  adjustRate(.1);
});

$('#Down').click(function() {
  adjustRate(-.1);
});

var $rate = $('#Rate');

function adjustRate(val) { 
  $rate.text(($rate.data().rate += val).toFixed(1));
}

当我在列表协作中插入两次相同的协作者时,我有以下错误:

  

javax.servlet.ServletException:   org.hibernate.exception.ConstraintViolationException:不能   执行声明

或更确切地说:

  

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:   密钥'UK_obmdv02oey7264a085m7baqbo'重复输入'2'

事实上,它说我不能为合作者分配两个不同的合作。

所以我打印了由mysql为n-n关系创建的表的创建,我有这个:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="Up">Up Vote</button>
<div id="Rate" data-rate="0">0</div>
<button id="Down">Down Vote</button>

所以我需要指定我的唯一键不仅是collaborators_id,还包括collaborators_id和collaboration_id。

我该怎么办?

3 个答案:

答案 0 :(得分:0)

您需要添加jointable注释

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

答案 1 :(得分:0)

要提供有关Amer答案的其他信息:

SQL

根据您的定义,您只在UNIQUE表中的collaborators_id上设置Collaboration_Collaborator约束。您需要将约束扩展到两列。 It's usually written like

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;

有些观点:

  1. schema是可选的,但我喜欢这样做以避免混淆
  2. 请注意joinColumnsinverseJoinColumns的顺序:joinColumns是指当前实体(在您的情况下为Collaboration),inverseJoinColumns是指实体Collaboration
  3. 相关
  4. 我认为在表CollaborationCollaborateur中,主键列为id
  5. 其它

    根据最佳做法,请避免混合语言:“Collaborator”(英语)和“Collaborateur”(假设法语)

答案 2 :(得分:0)

使用此联接表:

:s
相关问题