我是春天的新手。我认为用一个小例子来解释我的问题会更好。假设我有两个主要类:User
和Group
。 User
可以是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
)并从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
}
UserHasGroup:
group.users
到目前为止,这么好。所有测试都成功运行并保持功能。
但是我遇到了JSTL的问题。实际上,使用这种新结构显然不可能{{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 />