Doppelter Eintrag 'string1-string2' für Schlüssel 'PRIMARY'

In einer Spring MVC-Anwendung, die Hibernate und JPA über eine MySQL-Datenbank verwendet, wird die folgende Fehlermeldung zu einer untergeordneten Entität angezeigt, wenn ich versuche, eine übergeordnete Entität zu speichern, die die untergeordnete Entität enthält:

Duplicate entry 'string1-string2' for key 'PRIMARY'  

Hier,string1 undstring2 Verweisen Sie auf die beiden Teile des zusammengesetzten Primärschlüssels der untergeordneten Entität.Wie behebe ich diesen Fehler?

Auf diese Weise wird die Beziehung zwischen den Entitäten im übergeordneten Element definiertAddress Entität:

@ManyToOne(cascade = { CascadeType.ALL }, fetch=FetchType.EAGER)
@JoinColumns({ @JoinColumn(name = "usecode", referencedColumnName = "code", insertable = false, updatable = false),
        @JoinColumn(name = "usecodesystem", referencedColumnName = "codesystem", insertable = false, updatable = false)
})
public HL7GeneralCode use;

Hier ist die Art und Weise, wie die Beziehung im Kind definiert istGeneralCode Entität:

@OneToMany(mappedBy = "use", cascade = {CascadeType.ALL})
private Set<HL7Address> addresses;

Der vollständige Stack-Trace kann angezeigt werdenindem Sie auf diesen Link klicken.
Der vollständige Code für dieAddress Entität gefunden werden kannunter diesem link.

Der vollständige Code für dieGeneralCode Entität kann gelesen werdenunter diesem link.

Der Code für die zusammengesetzte Primärschlüsselklasse ist zu findenunter diesem link.
Und dasBaseEntity Klasse, die um erweitert wirdAddress kann gefunden werdenunter diesem link.

Ich habe viele Beiträge zu dieser Fehlermeldung gelesen. Die Antworten auf die anderen Postings beheben meine Fehlermeldung nicht und berücksichtigen im Allgemeinen nicht die Tatsache, dass meine Entität a verwendetzusammengesetzter Primärschlüssel.

BEARBEITEN:

Der Code zum Speichern der Adresse lautet:

@Override
public void savehl7Address(HL7Address addr) {
    if ((Integer)addr.getId() == null) {
        System.out.println("[[[[[[[[[[[[ about to persist address ]]]]]]]]]]]]]]]]]]]]");
        this.em.persist(addr);}
    else {
        System.out.println("]]]]]]]]]]]]]]]]]] about to merge address [[[[[[[[[[[[[[[[[[[[[");
        this.em.merge(addr);}
}
ZWEITE BEARBEITUNG:

Ich habe versucht, @Ben75s Rat zu befolgen, aber der Code stürzt in der Zeile abthis.em.persist(addr.getUse());. Beachten Sie, dass seine if-Klausel nicht zu meinem tatsächlichen Objektmodell passte. Daher habe ich die folgende if-Klausel in geändertif(addr.getUse() != null && addr.getId()==null). Hier ist mein Code.

@Override
public void savehl7Address(HL7Address addr) {
    if(addr.getUse() != null && addr.getId()==null){
        //this next line prints in the stack trace right before the app crashes
        System.out.println("about to this.em.persist(addr.getUse());");
        //HL7GeneralCode is not persistent yet
        this.em.persist(addr.getUse());
        //since there is a cascade ALL on the adresses relationship addr is now persistent
        return;
    }
    System.out.println("=========================== inside jpahl7patientrespository.savehl7Address(addr)");
    if ((Integer)addr.getId() == null) {
        System.out.println("[[[[[[[[[[[[ about to persist address ]]]]]]]]]]]]]]]]]]]]");
        this.em.persist(addr);}
    else {
        System.out.println("]]]]]]]]]]]]]]]]]] about to merge address [[[[[[[[[[[[[[[[[[[[[");
        this.em.merge(addr);}
}

Der relevante Teil von HL7Address ist nun:

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({ @JoinColumn(name = "usecode", referencedColumnName = "code", insertable = false, updatable = false),
        @JoinColumn(name = "usecodesystem", referencedColumnName = "codesystem", insertable = false, updatable = false)
})
public HL7GeneralCode use;

Der relevante Teil von HL7GeneralCode ist nun:

@OneToMany(mappedBy = "use")
private Set<HL7Address> addresses;

Der neue Stack-Trace kann gelesen werdenindem Sie auf diesen Link klicken.

Wie kann ich diesen Fehler beheben?

DRITTE ÄNDERUNG:

Ich folgte dem Rat von ben75, indem ich der Methode zum Speichern der Adresse den folgenden Code hinzufügte:

if(addr.getUse() != null && !this.em.contains(addr.getUse())){
    System.out.println("about to this.em.persist(addr.getUse());");
    this.em.persist(addr.getUse());return;
}

Leider erhalte ich immer noch den gleichen Fehler, obwohl der Stack-TraceSYSO zeigt an, dass der obige Code gerade ausgeführt wird, bevor die App abstürzt.

Sie können den resultierenden Stack-Trace lesenindem Sie auf diesen Link klicken.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage