2012-02-27 47 views
1

我是Spring的新手。我认为最好用一个小例子来解释我的问题。假设我有两个主要类别:UserGroup。 A User可以是更多GroupGroup的一部分,显然,可以具有更多User。所以他们之间的关系是多对多的。我想表明,是这样的(使用JSTL):显示@OneToMany和@ManyToOne编码的多对多关系的属性

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

基本上,输出应该是这样的:

随机(2):

布洛斯

星球大战(5):
卢克
丘巴卡
达斯维达
莱娅公主
尤达

任天堂(3):
超级马里奥
银河战士
塞尔达

我最初的经典@ManyToMany注释编码它,使用一个额外的表user_has_group (由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

是否存在与其他信息的任何问题,我已经提供? – 2012-02-29 23:05:26

回答

1

我没有看到$ {fn:length(group.userHasGroup)}应该不起作用的原因。

您可能遇到的唯一问题是一些没有活动会话异常。您可以通过

  • “鉴于公开会议”拦截器使用任何解决这个问题(其中有人拨打反模式)

  • manualy在列表中的服务方法

  • 渴望迭代取得关系 - 我会非常在意,因为这可能会导致许多查询到数据库

答案附加qu estion:

它应该以某种方式是这样的:

<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 2012-02-27 17:24:08

+0

谢谢!有时候,我觉得我很迟钝......(我会在7个小时内奖励赏金,现在我不能) – satoshi 2012-03-01 09:52:11