我是Spring的新手。我认为最好用一个小例子来解释我的问题。假设我有两个主要类别:User
和Group
。 A User
可以是更多Group
和Group
的一部分,显然,可以具有更多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
),并从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
}
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
遍历用户。
达到与之前相同的功能但使用这种新结构的最佳方式是什么?
谢谢。
是否存在与其他信息的任何问题,我已经提供? – 2012-02-29 23:05:26