使用Hibernate映射到实体ID

时间:2016-07-27 12:40:58

标签: java hibernate hql

有没有办法用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文档中找不到任何相关内容。

2 个答案:

答案 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)。我们使用它而不是获取具有多个关系的非常复杂的实体,它可以显着提高性能。