显示使用@OneToMany和@ManyToOne编码的多对多关系的属性

时间:2012-02-27 16:42:48

标签: spring jpa spring-mvc many-to-many jstl

我是春天的新手。我认为用一个小例子来解释我的问题会更好。假设我有两个主要类:UserGroupUser可以是Group的一部分而Group可以是User的一部分,显然可以有更多<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> s。所以它们之间的关系是多对多的。我想展示的是这样的(使用JSTL):

@ManyToMany

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

  

随机(2):
  乔
  布罗格斯

  星球大战(5):
  卢克
  楚巴卡
  Darth Vader
  莱娅公主   尤达

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

我最初使用经典的user_has_group注释对其进行编码,使用了另一个表user_has_group(由JPA创建和管理)并且它运行良好。

我需要修改结构,因为我需要joined_date表来获得UserHasGroup列。为实现这一目标,我在线阅读最佳解决方案是创建另一个类(即User)并从groupUserHasGroup向此类添加一对多关系。这样做,就可以向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
}

组:

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

UserHasGroup:

group.users

到目前为止,这么好。所有测试都成功运行并保持功能。

但是我遇到了JSTL的问题。实际上,使用这种新结构显然不可能{{1}}来迭代用户。

使用这种新结构获得与之前相同功能的最佳方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

我没有看到$ {fn:length(group.userHasGroup)}应该无效的原因。

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

解决它
  • 使用“在视图中打开会话”拦截器(有人称之为反模式)

  • 手动迭代服务方法中的列表

  • 渴望获取关系 - 我会非常小心,因为这会导致对数据库的许多查询

回答其他问题:

看起来应该是这样的:

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