JPA/Hibernate中键'PRIMARY'的重复输入

Min*_*Lyg 4 many-to-many hibernate jpa

many-to-many在mysql数据库(Module - <Module_has_Subject> - Subject)中有一个关系.Entites是由Eclipse生成的,我add在两个类中都添加了方法.我使用JBoss AS7/Hibernate.当我persist在EJB中调用该方法时,我得到了

org.hibernate.exception.ConstraintViolationException: Duplicate entry '3' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)

我知道这一定是一个微不足道的错误,但我只是没有看到它.我通过最相关的问题就在这里StackOverflow上和RoseIndia(我加了cascade,targetEntity......),并且仍然没有成功.表的实体是这样的:

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);
    }
}
...}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
    ...}
Run Code Online (Sandbox Code Playgroud)

SubjectEJB.java

...
Subject subject = new Subject();
for(Module module : subjectModules) {
  subject.addModule(module);
}
em.persist(subject);
em.flush();
...
Run Code Online (Sandbox Code Playgroud)

小智 6

我不知道你是否设法解决了你的问题,但我刚刚遇到了同样的问题.

在我使用的@OneToMany映射中CascadeType.ALL,当我尝试保存实体时,导致保存了2条记录.(重复数据,不同ID)

在网上滚动后,我发现这个http://forums.codeguru.com/showthread.php?t=511992,所以我改为CascadeType.ALL{CascadeType.PERSIST, CascadeType.MERGE},这导致了你的错误:

"ConstraintViolationException: Duplicate entry '9-2-2012-05-30' for key 'PlayerId'"
Run Code Online (Sandbox Code Playgroud)

最后我删除CascadeType.MERGE并留下了CascadeType.PERSIST修复重复条目错误和重复记录.

作为一个观点,如果我使用just CascadeType.MERGE或just CascadeType.PERSIST,我没有错误,也没有重复的数据

有也许尝试CascadeType.MERGECascadeType.PERSIST,如果你得到错误,请尝试只CascadeType.MERGE.

这不是理想的,但希望它有所帮助.

克里斯