【问题标题】:Display attributes of many to many relationship coded with @OneToMany and @ManyToOne显示使用@OneToMany 和@ManyToOne 编码的多对多关系的属性
【发布时间】:2012-02-27 16:42:47
【问题描述】:

我是春天的新手。我认为最好用一个小例子来解释我的问题。假设我有两个主要课程:UserGroupUser 可以是更多Groups 的一部分,而Group 显然可以拥有更多Users。所以它们之间的关系是多对多的。我想展示的是这样的(使用 JSTL):

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

博客

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

任天堂 (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
}

用户有组:

@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 来遍历用户。

使用这种新结构实现与以前相同的功能的最佳方法是什么?

谢谢。

【问题讨论】:

  • 我提供的附加信息有问题吗?

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


【解决方案1】:

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

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

  • 使用“open session in view”拦截器(有人称之为反模式)

  • 手动遍历服务方法中的列表

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

回答其他问题:

它应该看起来像这样:

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

【讨论】:

  • 非常感谢@frant.hartm。你是对的,这是一个可行的解决方案。但是现在假设我想向组中的用户展示......(相应地编辑了问题)
  • 谢谢!是啊,有时我觉得我是智障......(我会在 7 小时内奖励赏金,现在我不能)
猜你喜欢
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2021-02-08
相关资源
最近更新 更多