如何使用hibernate标准与映射实体创建多对多关系的别名

时间:2015-08-07 08:36:42

标签: hibernate join many-to-many

我将通过具体示例描述我的问题:我有两个具有ManyToMany关系的实体:操作和用户。 Hibernate code-generator-tool创建了一个名为Operation-User的映射实体,包括一个复杂的PK。这似乎如下:

Operations{
...
private Set<OperationsUsers> operationsUserses= new HashSet<OperationsUsers>(0);
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "operations", cascade = CascadeType.ALL)
public Set<OperationsUsers> getOperationsUserses() {
    return this.operationsUserses;
}
...
}


OperationsUsers{
...
private OperationsUsersId id;
...
@EmbeddedId
@AttributeOverrides({
        @AttributeOverride(name = "codUsuario", column = @Column(name = "COD_USUARIO", nullable = false, length = 20)),
        @AttributeOverride(name = "codRol", column = @Column(name = "COD_ROL", nullable = false, length = 4)),
        @AttributeOverride(name = "codRefOperacion", column = @Column(name = "COD_REF_OPERACION", nullable = false, length = 35)) })
...
public OperationsUsersId getId() {
    return this.id;
}
...
}

OperationsUsersId{
...
@Column(name = "COD_USUARIO", nullable = false, length = 20)
public String getCodUsuario() {
    return this.codUsuario;
}
...
}

Users.java{
...
private String codUsuario;
...
}

正如您所看到的,Operation实体与映射表OpeionsUsers具有OneToMany关系,但另一方面,OptionsUsersId和Users之间没有映射关系,codUsuario是两者的连接列。所以我的问题是我想使用Hibernate Criteria构建一个动态连接查询,为此,我需要获得每个关系方的别名,我的意思是,我得到了

Session session = (Session) em.getDelegate();
Criteria criteria =session.createCriteria(Operations.class);
criteria.createAlias("operationsUserses", "opUsers");

但是我无法或者我不知道如何创建别名来收集与特定操作相关的每个用户,并在其他查询中使用此别名来从用户实体获取字段。 也许解决方案的最佳方法是更改​​模型并映射OperationsUsersId和Users之间的OneToMany关系

非常感谢您的帮助

更新(2015/08/07)我忘了添加一个对OperationsUsers中的操作的映射引用,即:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COD_REF_OPERACION", nullable = false, insertable = false, updatable = false)
public Operations getOperations() {
    return this.operations;
}

1 个答案:

答案 0 :(得分:0)

我懂了!解决方案比我在开始时想的更简单。就在我发布问题的那一刻,我意识到解决方案可能是改变从用户到OperationsUsers的映射,以便为Opertaions和OperationsUsers之间的关系指定相同的方式。在这种情况下,复合pk(OperationsUsersId)没有任何相关性。我的课程最终如下:

Operations{
...
private Set<OperationsUsers> operationsUserses= new HashSet<OperationsUsers>(0);
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "operations", cascade = CascadeType.ALL)
public Set<OperationsUsers> getOperationsUserses() {
return this.operationsUserses;
}
...
}

OperationsUsers{
...
private Users users;
private Operations operations; 
...
@EmbeddedId
@AttributeOverrides({
    @AttributeOverride(name = "codUsuario", column = @Column(name = "COD_USUARIO", nullable = false, length = 20)),
    @AttributeOverride(name = "codRol", column = @Column(name = "COD_ROL", nullable = false, length = 4)),
    @AttributeOverride(name = "codRefOperacion", column = @Column(name = "COD_REF_OPERACION", nullable = false, length = 35)) })
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COD_REF_OPERACION", nullable = false, insertable = false, updatable = false)
public Operations  getOperations () {
    return this.operations ;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COD_USUARIO", nullable = false, insertable = false, updatable = false)
public Users getUsers() {
    return this.Users;
}
...
}

Users{
...
private String codUsuario;
private Set<OperationsUsers> operationsUserses = new HashSet<OperationsUsers>(0);
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "ealUsusUsuarios", cascade = CascadeType.ALL)
public Set<OperationsUsers> getOperationsUserses () {
    return operationsUserses ;
}
...
}

现在,我可以创建两个别名:

criteria.createAlias("operationsUserses", "opUsers");
criteria.createAlias("operationsUserses.users", "users");

希望这会对其他人有所帮助