- Subject) database...">

Duplicate entry for "PRIMARY" key in JPA / Hibernate

I have a relation many-to-manyin mysql ( Module - <Module_has_Subject> - Subject) database . The objects were generated by Eclipse, I added a method addin both classes. I am using JBoss AS7 / Hibernate. When I call a persistmethod in EJB, I get

org.hibernate.exception.ConstraintViolationException: Duplicate entry '3' for key 'PRIMARY'

I know this should be a trivial mistake, but I just don't see it. I've gone through most of the associated problems here in StackOverflow and RoseIndia (I added cascade, targetEntity...), but still to no avail. Objects for tables 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();
...
+3
source share
1 answer

I don’t know if you managed to solve your problem, but I have exactly the same problem.

@OneToMany CascadeType.ALL 2 . ( , )

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'"

, CascadeType.MERGE CascadeType.PERSIST .

, CascadeType.MERGE CascadeType.PERSIST,

, CascadeType.MERGE CascadeType.PERSIST, , CascadeType.MERGE.

, , .

+6

All Articles