Повторяющаяся запись 'string1-string2' для ключа 'PRIMARY'

В приложении Spring MVC, использующем hibernate и jpa поверх базы данных MySQL, я получаю следующее сообщение об ошибке о дочернем объекте всякий раз, когда пытаюсь сохранить родительский объект, который включает дочерний объект:

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

Вот,string1 а такжеstring2 обратитесь к двум частям составного первичного ключа дочерней сущности.Как мне решить эту ошибку?

Вот способ, которым отношения между сущностями определены в родительскомAddress юридическое лицо:

@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;

Вот как определяются отношения у ребенкаGeneralCode юридическое лицо:

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

Полный след стека можно просмотретьнажав на эту ссылку.
Полный код дляAddress сущность может быть найденапо этой ссылке.

Полный код дляGeneralCode сущность может быть прочитанапо этой ссылке.

Код для составного класса первичного ключа можно найтипо этой ссылке.
ИBaseEntity класс, который расширенAddress может быть найденпо этой ссылке.

Я прочитал много сообщений на это сообщение об ошибке. Ответы на другие публикации не разрешают мое сообщение об ошибке, и, как правило, не учитывают тот факт, что моя организация используетсоставной первичный ключ.

РЕДАКТИРОВАТЬ:

Код для сохранения адреса:

@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);}
}
ВТОРОЙ РЕДАКТИРОВАТЬ:

Я пытался следовать совету @ Ben75, но код вылетает на линииthis.em.persist(addr.getUse());, Обратите внимание, что его условие if не соответствует моей реальной объектной модели, поэтому я изменил приведенное ниже условие if наif(addr.getUse() != null && addr.getId()==null), Вот мой код

@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);}
}

Соответствующая часть HL7Address теперь:

@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;

Соответствующая часть HL7GeneralCode теперь:

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

Новая трассировка стека может быть прочитананажав на эту ссылку.

Как я могу устранить эту ошибку?

Третье редактирование:

Я последовал совету ben75, добавив следующий код в метод сохранения адреса:

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;
}

К сожалению, я все еще получаю ту же ошибку, несмотря на то, что трассировка стекаSYSO указывает на то, что приведенный выше код выполняется непосредственно перед тем, как приложение завершает работу.

Вы можете прочитать полученную трассировку стеканажав на эту ссылку.

Ответы на вопрос(2)

Ваш ответ на вопрос