2015-05-06 2 views
0

У меня есть следующие отображения в 2 моей фасолиNonUniqueObjectException: Другой объект с тем же значением идентификатора уже был связан с сессией

Родитель Bean

@OneToMany(fetch = FetchType.LAZY, mappedBy = "application") 
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) 
@JsonIgnore 
private Set<ApplicationBuildVO> applicationBuilds = new HashSet<ApplicationBuildVO>(0); 

Ребенок Bean

@ManyToOne(fetch = FetchType.LAZY) 
@Cascade({CascadeType.SAVE_UPDATE}) 
@JoinColumn(name = "APPLICATION_ID", nullable = false) 
@JsonIgnore 
private ApplicationVO application; 

В моем методе обслуживания - я выполняю поиск на Application bea п Создание приложения ребенка боб - который имеет ссылку на родительский приложения

Тогда - когда я пытаюсь обновить значение на родительском компоненте в том же методе обслуживания я получаю следующую ошибку

Caused by: org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.domain.dao.ApplicationVO#1] 
    at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:617) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:301) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:244) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 

Код моей услуги (снятый) выглядит следующим образом:

public boolean performBuild(Integer applicationId) { 
     ApplicationVO applicationVO = applicationServices.findAnyApplicationId(applicationId); 

     ApplicationBuildVO androidApplicationBuildVO = new ApplicationBuildVO(); 
     androidApplicationBuildVO.setIsAndroid(true); 
     androidApplicationBuildVO.setIsSuccess(appBuildSuccessful); 
     androidApplicationBuildVO.setApplication(applicationVO); 
     androidApplicationBuildVO.setSoftwareVersion(androidSoftwareVersionVO); 
     androidApplicationBuildVO.setS3BucketName(mobileAppsBucketName); 
     androidApplicationBuildVO.setS3ArtifactKey(androidArtifact); 

     Integer applicationBuildId = applicationBuildServices.saveApplicationBuild(androidApplicationBuildVO); 

     applicationVO.setIsCurrentlyBeingBuilt(false); 
     boolean updateApplicationResult = applicationServices.updateApplication(applicationVO);   
} 

Любые идеи, что я могу сделать для решения этой проблемы?

+1

Вы не могли бы выслать код своего обновления? –

+0

Уверен - только что обновил сообщение –

+1

Как назначаются ваши '@ Id'? Я предполагаю, что с помощью какого-то '@ GeneratedValue' ... – Powerlord

ответ

1

Я думаю, ваша проблема вызвана тем, ваши сохраняемое androidApplicationBuildVO ребенка первым и после того, что вы сохраните родительский applicationVO вы могли бы добавить ребенок к родителю и сохранить родитель подобные:

boolean performBuild(Integer applicationId) { 
    ApplicationVO applicationVO = applicationServices.findAnyApplicationId(applicationId); 

    ApplicationBuildVO androidApplicationBuildVO = new ApplicationBuildVO(); 
    androidApplicationBuildVO.setIsAndroid(true); 
    androidApplicationBuildVO.setIsSuccess(appBuildSuccessful); 
    androidApplicationBuildVO.setApplication(applicationVO); 
    androidApplicationBuildVO.setSoftwareVersion(androidSoftwareVersionVO); 
    androidApplicationBuildVO.setS3BucketName(mobileAppsBucketName); 
    androidApplicationBuildVO.setS3ArtifactKey(androidArtifact); 

    applicationVO.addBuild(androidApplicationBuildVO); 

    applicationVO.setIsCurrentlyBeingBuilt(false); 
    boolean updateApplicationResult = applicationServices.updateApplication(applicationVO);   
    } 

И вы должны добавить этот метод, если он не существует в applicationVO

public void addBuild(ApplicationBuildVO buildVo) { 
    applicationBuilds.add(buildVo); 
} 

Остерегайтесь equals и hashcode реализации в ApplicationBuildVO не должно основываться на I d не иметь сюрпризов при добавлении не сохраненных элементов applicationBuilds Набор.

+0

Идеально, что решила проблему - Спасибо Master Mind –

+1

Идеально вам понравится –

Смежные вопросы

 Смежные вопросы