在JPA / Hibernate中重复键入'PRIMARY'的条目 [英] Duplicate entry for key 'PRIMARY' in JPA/Hibernate

查看:105
本文介绍了在JPA / Hibernate中重复键入'PRIMARY'的条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在mysql数据库中有多对多的关系(模块 - < Module_has_Subject> - 主题)。实体由Eclipse生成,我在两个类中都添加了方法'add'。我使用JBoss AS7 / Hibernate。当我在EJB中调用persist方法时,我得到org.hibernate.exception.ConstraintViolationException:重复键'PRIMARY'的条目'3'。我知道这肯定是一个微不足道的错误,但我只是看不到它。我在Stackoverflow和roseindia(我添加了cascade,targetEntity,...)这里经历了大部分相关的问题,但仍然没有成功。表格的实体是这样的:



Module.java

  @实体
@Table(name =Module)
public class Module实现Serializable {

@Id
@Column(unique = true,nullable = false)
private int idModule;

//双向多对多关联到主题
@ManyToMany(mappedBy =modules,fetch = FetchType.EAGER,targetEntity = entity.Subject.class,cascade = CascadeType.ALL)
私人列表< Subject>科目;

public void addSubject(Subject subject){
if(subject.getModules()== null){
subject.setModules(new ArrayList< Module>());
}
if(getSubjects()== null){
setSubjects(new ArrayList< Subject>()); $!
$ b if(!getSubjects()。contains(subject)){
getSubjects()。add(subject); (!)。contains(this)){
}
if(!subject.getModules()。contains(this)){
subject.getModules()。add(this);
}
}
...}

Subject.java

$ $ $ $

$ @ $实体
@Table(name =Subject)
public class Subject implements Serializable {

@Id
@Column(unique = true,nullable = false)
private int idSubject;

//双向多对多关联到模块
@ManyToMany(fetch = FetchType.EAGER,targetEntity = entity.Module.class,cascade = CascadeType.ALL)
@JoinTable(
name =Module_has_Subject
,joinColumns = {
@JoinColumn(name =Subject_idSubject,nullable = false,referencedColumnName =idSubject)
}
,inverseJoinColumns = {
@JoinColumn(name =Module_idModule,nullable = false,referencedColumnName =idModule)
}

private List< Module>模块;
$ b $ public void addModule(Module module){
if(getModules()== null){
setModules(new ArrayList< Module>) ();
}
if(module.getSubjects()== null){
module.setSubjects(new ArrayList< Subject>()); ($!


if(!getModules()。contains(module)){
getModules()。add(module); $!
$ b if(!module.getSubjects()。contains(this)){
module.getSubjects()。add(this);
}
}
...}

SubjectEJB.java

  ... 
标题subject = new Subject();
for(Module module:subjectModules){
subject.addModule(module);
}
em.persist(subject);
em.flush();
...


解决方案

知道你是否设法解决你的问题,但我刚刚有完全相同的问题。

在我的@OneToMany映射中,我使用Cascade.ALL生成了2条记录当我试图保存实体时被保存。 (重复的数据,不同的ID)

在网络上滚动后,我发现这个 http://forums.codeguru.com/showthread.php?t=511992 ,所以我从CascadeType.ALL改为{CascadeType.PERSIST,CascadeType.MERGE},这导致你有错误ConstraintViolationException:重复条目'9-2-2012-05-30'关键'PlayerId'



最后,我删除了Cascade.MERGE和留下了CascadeType.PERSIST,它修复了重复的输入错误和重复的记录。



作为一个观点,如果我只使用MERGE或者只使用PERSIST,没有重复的数据



也许尝试使用MERGE和PERSIST,如果出现错误,请尝试使用MERGE。 这是不理想的,但希望它有帮助。



克里斯


I have many-to-many relation in mysql database (Module -< Module_has_Subject >- Subject). Entites were generated by Eclipse, I added method 'add' in both classes. I use JBoss AS7/Hibernate. When I call persist method in EJB, I get org.hibernate.exception.ConstraintViolationException: Duplicate entry '3' for key 'PRIMARY'. I know it must be a trivial mistake, but i just don't see it. I went through most related problems here on Stackoverflow and roseindia (I added cascade, targetEntity,...) and still without success. Entities for tables are as such:

Module.java

@Entity
@Table(name="Module")
public class Module implements Serializable {

@Id
@Column(unique=true, nullable=false)
private int idModule;

//bi-directional many-to-many association to Subject
@ManyToMany(mappedBy="modules", fetch=FetchType.EAGER,targetEntity=entity.Subject.class,cascade=CascadeType.ALL)
private List<Subject> subjects;

public void addSubject(Subject subject) {
    if(subject.getModules() == null) {
        subject.setModules(new ArrayList<Module>());
    }
    if(getSubjects() == null) {
        setSubjects(new ArrayList<Subject>());
    }
    if (!getSubjects().contains(subject)) {
        getSubjects().add(subject);
    }
    if (!subject.getModules().contains(this)) {
        subject.getModules().add(this);
    }
}
...}

Subject.java

@Entity
@Table(name="Subject")
public class Subject implements Serializable {

    @Id
    @Column(unique=true, nullable=false)
    private int idSubject;

    //bi-directional many-to-many association to Module
    @ManyToMany(fetch=FetchType.EAGER, targetEntity=entity.Module.class,cascade=CascadeType.ALL)
    @JoinTable(
        name="Module_has_Subject"
        , joinColumns={
            @JoinColumn(name="Subject_idSubject", nullable=false, referencedColumnName="idSubject")
            }
        , inverseJoinColumns={
            @JoinColumn(name="Module_idModule", nullable=false, referencedColumnName="idModule")
            }
        )
    private List<Module> modules;

    public void addModule(Module module) {
        if(getModules() == null) {
            setModules(new ArrayList<Module>());
        }
        if(module.getSubjects() == null) {
            module.setSubjects(new ArrayList<Subject>());
        }

        if (!getModules().contains(module)) {
            getModules().add(module);
        }
        if (!module.getSubjects().contains(this)) {
            module.getSubjects().add(this);
        }
    }
    ...}

SubjectEJB.java

...
Subject subject = new Subject();
for(Module module : subjectModules) {
  subject.addModule(module);
}
em.persist(subject);
em.flush();
...

解决方案

I don't know if you managed to solve your problem yet, but I have just had exactly the same problem.

In my @OneToMany mapping I used Cascade.ALL which resulted in 2 records being saved when I attempted to save the entity. (duplicated data, different ID's)

After scrolling on the web, I found this http://forums.codeguru.com/showthread.php?t=511992, so I changed from CascadeType.ALL to {CascadeType.PERSIST, CascadeType.MERGE}, which caused the error you have "ConstraintViolationException: Duplicate entry '9-2-2012-05-30' for key 'PlayerId'"

Finally I removed Cascade.MERGE and was left with CascadeType.PERSIST which fixed the duplicate entry error and the duplicated records.

As a point, if I use just MERGE or just PERSIST, I get no errors and no duplicated data

Maybe try with MERGE and PERSIST, if you get errors, try with just MERGE.

It is not ideal, but hope it helps.

Chris

这篇关于在JPA / Hibernate中重复键入'PRIMARY'的条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆