2012-02-27 3 views
1

저는 봄에 초보자입니다. 나는 약간의 예를 들어 내 문제를 설명하는 것이 더 낫다고 생각한다. 두 개의 주요 클래스 인 UserGroup이 있다고 가정 해 보겠습니다. User은 더 Group s의 부분 일 수 있으며 Group은 분명히 더 User s 일 수 있습니다. 그래서 그들 사이의 관계는 many to many입니다.
@OneToMany 및 @ManyToOne으로 코딩 된 다 대다 관계의 속성 표시

랜덤 (2) :

Bloggs에

<c:forEach items="${groups}" var="group"> 
    <c:out value="${group.name}"/> (<c:out value="${fn:length(group.users)}" />):<br /> 
    <c:forEach items="${groups.users}" var="user"> 
     <c:out value="${user.name}"/><br /> 
    </c:forEach><br /> 
</c:forEach> 

기본적으로, 출력과 같이해야한다 :이 같은 뭔가 (사용 JSTL) 내가 보여 드리고자 무엇입니까

스타 워즈 (5) :
누가 복음
추바카
다스 베이더
레이아 공주
요다

닌텐도 (3) :
슈퍼 마리오
메트로이드
젤다

내가 처음에 추가 테이블 user_has_group를 사용하여, 고전 @ManyToMany 주석을 코딩 (JPA에 의해 생성되고 관리 됨) 완벽하게 작동하고있었습니다.

user_has_group 테이블에 joined_date 열이 있어야하므로 구조를 수정해야했습니다. 이를 달성하기 위해 최선의 해결책은 다른 클래스 (예 : UserHasGroup)를 만들고이 클래스에 일대 다 관계를 Usergroup에서 추가하는 것입니다. 이렇게하면 UserHasGroup 클래스에 속성을 추가 할 수 있습니다 (따라서 user_has_group 테이블에 추가 열을 추가 할 수 있습니다). 같은 뭔가 :

사용자 :

@Entity 
@Table(name = "user") 
public class User 
{ 
    @Id 
    @GeneratedValue 
    @Column 
    private int id; 

    @Column 
    private String alias; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user") 
    private List<UserHasGroup> userHasGroup = new ArrayList<UserHasGroup>(); 

    // Constructors/getters/setters 
} 

그룹 :

@Entity 
@Table(name = "`group`") 
public class Group 
{ 
    @Id 
    @GeneratedValue 
    @Column 
    private int id; 

    @Column 
    private String name; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "group") 
    private List<UserHasGroup> userHasGroup = new ArrayList<UserHasGroup>(); 

    // Constructors/getters/setters 
} 

UserHasGroup :

@Entity 
@Table(name = "user_has_group") 
public class UserHasGroup 
{ 
    @Id 
    @GeneratedValue 
    @Column 
    private int id; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToOne 
    @JoinColumn(name = "group_id") 
    private Group group; 

    @Column 
    @Temporal(TemporalType.DATE) 
    private Date joinedDate; 

    // Constructors/getters/setters 
} 

지금까지 너무 좋아. 모든 테스트가 성공적으로 실행되고 기능이 유지됩니다.

하지만 JSTL에 문제가 있습니다. 사실,이 새로운 구조를 사용하면 분명히 group.users을 반복하여 사용자를 반복 할 수 없습니다.

이 새로운 구조로 이전과 같은 기능을 수행하는 가장 좋은 방법은 무엇입니까?

감사합니다.

+0

있습니까? –

답변

1

$ {fn : length (group.userHasGroup)}이 (가) 작동하지 않아야하는 이유가 표시되지 않습니다.

활성 문제가없는 경우에만 문제가 발생할 수 있습니다. 당신은

  • 열망 서비스 방법의 목록을 반복 수동으로 실시

  • (누군가가 안티 패턴 호출하는) 인터셉터 "보기에서 열린 세션"을 사용하여

    • 에 의해 중 하나를 해결할 수 있습니다 관계 가져 오기 - 나는 데이터베이스에 많은 쿼리를 초래할 수 있으므로 여기에서 매우주의해야한다.

    추가 답변 estion :

    그것은 다음과 같이 어떻게 든 찾아야한다 : I 제공 한 추가 정보에 문제가

    <c:forEach items="${groups}" var="group"> 
        <c:out value="${group.name}"/> (<c:out value="${fn:length(group.userHasGroup)}" />):<br /> 
        <c:forEach items="${groups.userHasGroup}" var="userHasGroup"> 
         <c:out value="${userHasGroup.user.name}"/><br /> 
        </c:forEach><br /> 
    

  • +0

    고맙습니다, @ frant.hartm. 네 말이 맞아,이게 효과가있는 해결책이다. 하지만 이제는 그룹의 사용자를 표시하고 싶다고합시다 ... (그에 따라 편집 됨) – satoshi

    +0

    고마워요! Yeh, 가끔씩 나는 지체되었다고 생각합니다 .... (나는 7 시간 만에 현상금을 수여 할 것이고, 지금은 그럴 수 없다) – satoshi

    관련 문제