我遇到了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。
我该怎么办?
答案 0 :(得分:0)
您需要添加jointable注释
@ManyToMany(targetEntity=Collaborator.class ,fetch = FetchType.EAGER)
@JoinTable
private List<Collaborator> collaborators;
答案 1 :(得分:0)
要提供有关Amer答案的其他信息:
根据您的定义,您只在UNIQUE
表中的collaborators_id
上设置Collaboration_Collaborator
约束。您需要将约束扩展到两列。 It's usually written like:
CONSTRAINT "UK_obmdv02oey7264a085m7baqbo" UNIQUE(Collaboration_id, collaborators_id)
请检查适合您数据库的正确语法
正如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
根据最佳做法,请避免混合语言:“Collaborator”(英语)和“Collaborateur”(假设法语)
答案 2 :(得分:0)
使用此联接表:
:s