有没有办法用ID来映射实体?
目前,我有一个有效的代码:
用户对象分配了一些角色:
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinTable(name = "USER_ROLES", joinColumns = {
@JoinColumn(name = "USER_ID", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "ROLE_ID", nullable = false, updatable = false) })
protected List<Role> assignedRoles = new ArrayList<>();
角色映射到用户:
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "assignedRoles")
protected Collection<? extends User> users;
问题是,我想要的是:
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "assignedRoles")
protected Collection<Integer> users;
操作userIds而不是User对象。
是否有可能以某种方式配置映射以这种方式工作?我在Hibernate文档中找不到任何相关内容。
答案 0 :(得分:2)
除了tringel提供的解决方案之外,您还可以尝试使用hibernate的基本集合映射功能:
@ElementCollection
@CollectionTable(name="USER_ROLES", joinColumns=@JoinColumn(name="ROLE_ID"))
@Column(name="USER_ID")
protected Set<Integer> users;
使用此策略,您还可以映射更复杂的值类型,例如某种包含用户ID和其他一些有用属性的UserRef
对象:
@ElementCollection
@CollectionTable(name="USER_ROLES", joinColumns=@JoinColumn(name="ROLE_ID"))
@Column(name="USER_ID")
protected Set<UserRef> users;
...
@Embeddable
public class UserRef {
public Integer id;
public String name;
}
答案 1 :(得分:1)
这可以使用Hibernates @Formula而不是映射。 因此,对于包含user_id和role_id列的user_roles表,这应该有效:
@Formula("(SELECT USER_ID " +
"FROM USER_ROLES " +
"WHERE ROLE_ID = id")
protected Collection<Integer> users;
在此示例中,参数 id 是使用此公式的实体的id字段,因此可能是角色实体。 如果您的用户实体是一个相当基本的实体,这可能无法提高性能(如已提到的isnot2bad)。我们使用它而不是获取具有多个关系的非常复杂的实体,它可以显着提高性能。