2011-10-10 2 views
1

아래 코드를 실행하려고하는데 "제거 된 엔터티를 병합 할 수 없습니다."라는 오류 메시지가 계속 나타납니다.엔터티 빈에서 관련 엔터티 빈 목록을 지울 수 없습니다.

내 DB 테이블은 다음과 같이 :

banner 
-id 

banner_period 
-id 
-banner_id 
-date 

내 자바 코드 : 나는 모든이의 논리를 이해할 수없는 것

Banner b = getEntityManager().find(banner.getId()); 
List<BannerPeriod> bps = b.getBannerPeriodList(); 
for (BannerPeriod bp : bps) { 
    getEntityManager().remove(bp); 
} 
// <-- removed code that adds periods here 
b.setBannerPeriodList(bps); 
getEntityManager().merge(b); 

. 아무도 그게 뭔지 설명 할 수 있을까요, 내가 여기에없는거야? 이미 답변을 검색하려고 시도했지만 관련성 높은 결과를 제공하는 키워드를 정의하기가 어렵습니다.

UPDATE :

배너 엔티티 :

@OneToMany(cascade = CascadeType.ALL, mappedBy = "bannerId") 
private List<BannerPeriod> bannerPeriodList; 

BannerPeriod 엔티티 :

@JoinColumn(name = "banner_id", referencedColumnName = "id") 
@ManyToOne(optional = false) 
private Banner bannerId; 
+0

도움이 될 배너/BannerPeriod 관계에 대한 매핑 정의를 살펴보면보십시오. 게시 할 수 있습니까? –

+0

그래. 관계는 데이터베이스에서 계단식으로 정의됩니다. 위의 업데이트를 참조하십시오. –

답변

2

List<BannerPeriod> bps 여전히 BannerPeriod들에 대한 참조를 포함합니다. 따라서 b에서 병합을 호출하면 어떻게됩니까?

merge on b 
-> Cascade all on bannerPeriodList 
-> Iterate over bannerPeriodList and merge them 
**ERROR** The values in bannerPeriodList have been removed. 

bps.clear(); 
b.setBannerPeriodList(bps); 
getEntityManager().merge(b); 
+0

제안 해 주셔서 감사합니다. 나는 그것을 시도했다. 어떤 일이 발생하는지는 목록이 지워지지만 병합은 변경 내용을 데이터베이스에 적용하지 않는다는 것입니다. 목록을 지우면 목록이 실제로 비어 있는지 확인하고 새 BannerPeriod를 목록에 추가 한 다음 병합하면 기존 기간이 데이터베이스에 그대로 남아 있기 때문에 이상합니다. 그러나 Java에서 엔티티를 보면 새로 추가 된 BannerPeriod 만 목록에 있습니다. 그것은 관계가 데이터베이스에서 깨 졌기 때문이 아닙니다. 왜냐하면 서버를 다시 시작하면 모든 기간이 이전 및 신규 모두 반환되기 때문입니다. –

+1

병합을 생략하면 어떻게됩니까? 또한 ORM에서 SQL 디버깅을 켤 수 있습니까? 배후에서 무슨 일이 일어나는지 보는데 도움이 될 것입니다. –

+0

감사합니다 !!! 나는 그것을하는 것을 결코 고려하지 않았다. 병합을 생략하면 작동합니다. 나는 1) 목록을 실행하고 getEntityManager()를 수행해야한다. 각 기간마다 remove (BannerPeriod)를 수행 한 다음 2) 마침표 목록에서 clear()를 사용하고 마침내 3) 병합을 생략한다. 모든 것을 결합했을 때만 예외를 피하고 내 개체와 데이터베이스에서 동일한 결과를 얻습니다. 음, 나는 지금 당장 생각하고있다. 아마도 자동 커밋 (auto-commit)이 켜져있어 모든 것이 두 번 커밋된다. 나는 그것을 조사해야 할 것이다. –