2009-06-03 2 views
5

우리 팀에는 UserStore의 두 클래스가 있고 JPA @ManyToMany 주석이 관련되어 있습니다. 관련 코드는 다음과 같습니다.JPA @ManyToMany 작성 중이지만 업데이트되지 않음

User 개체를 만들고 저장소를 설정하면 수명이 좋습니다. Struts 2/Spring 웹 UI를 통해 User 객체를 업데이트하려고 할 때 예기치 않은 동작이 발생합니다. JUnit을 통한 간단한 자동화 된 통합 테스트를 실행할 때 이러한 문제는 발생하지 않습니다.

간단히 말하면 User을 저장할 때 저장소 컬렉션이 업데이트되지 않습니다. 데이터베이스에 변경 사항이 표시되지 않고 문제가있는 User 개체를 다시로드하면 저장소 집합이 변경되지 않은 것으로 나타납니다.

우리가이 문제에 대해 발견 한 유일한 해결책은 우리가이 솔루션을 좋아하지 않는다는 것입니다. 우리 팀의 모든 개발자가 기분이 좋지 않습니다. Store의 새 Set을 만든 다음 user.setStores(null)을 수행 한 다음 user.setStores(stores)을 수행하십시오.

OpenEntityManagerInViewFilter을 사용하고 있습니다. JPA 프로 바이더로서 Hibernate를 사용하고 있습니다. 우리는 Spring의 JpaTransactionManager를 사용하고 있습니다. 우리는 코드에 @Transactional 어노테이션을 가지고 있지 않으며, 추가하면 다른 곳에서 설명한 프록시 동작으로 인해 기존 코드가 손상됩니다.

우리가 비 큐스 방식으로이 문제를 해결할 수있는 방법에 대해 알려줄 수있는 모든 통찰력을 환영합니다.


User.java 주요부 : Store.java의

@ManyToMany 
@JoinTable(name = "company.user_store_access", 
     joinColumns = @JoinColumn(name = "userid"), 
     inverseJoinColumns = @JoinColumn(name = "storeid")) 
public Set<Store> getStores() { 
    return stores; 
} 

주요부 : UserDetailAction.java의

@ManyToMany(mappedBy = "stores") 
    public List<User> getUsers() { 
     return users; 
    } 

관련 부분 : (패스 - 스루 층 아래 또는 두 가지 : 그리고 나서 :)

entity = getEntityManager().merge(entity); 
+1

상점을 추가/수정하는 코드 줄을 추가 할 수 있습니까? –

답변

1

는 사용자 개체에 다음과 같은 주석을 시도해보십시오 :

@ManyToMany(cascade = {CascadeType.ALL}) 
+0

오전에 시도해 보겠습니다. @ManyToMany (cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 을 이미 추가했습니다. –

6

문제는 당신이 양방향 관계를 가지고 있고,이 경우에 다른 사람을 제어하고 당신의 제어 매핑에서 하나의 엔티티 있다는 것입니다 하나는 스토어 엔티티이고 사용자는이 아니므로 스토어에 사용자를 추가하는 것이 효과적 일 수 있습니다 (스토어가 제어하는 ​​사람이므로). 사용자에게 스토어를 추가하는 것은 효과가 없습니다.

@ManyToMany (mappedBy = "users") 주석을 getStores() 메소드에 넣고 getUsers() 메소드를 변경하여 관계를 제어하는 ​​사용자 오브젝트를 작성하여 상황을 반전 시키십시오.

희망이있었습니다.

P. 관계를 제어하는 ​​엔티티는 항상 mappedBy 속성이없는 엔티티입니다.

2

방금 ​​같은 문제에 봉착하고 다른 페이지에서 해결책을 찾았습니다.여기

나 getJpaTemplate를 호출

위해 일한 것을()이다. 플러시() 병합을 호출하는 것은 나를 위해 일한 전에.

나는 그것이 효과가있는 이유를 얻지 못했습니다.