【发布时间】:2012-02-27 16:42:47
【问题描述】:
我是春天的新手。我认为最好用一个小例子来解释我的问题。假设我有两个主要课程:User 和 Group。 User 可以是更多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)并将User 和group 的一对多关系添加到该类。这样做,可以向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