好的,这就是我目前所发现的:
谢谢我的朋友:
https://hibernate.atlassian.net/browse/HHH-5764
这很可能是这种行为的原因。
我找到了一个解决方法:
许可.java:
@Entity
@IdClass(PermissionPk.class)
public class Permission{
@Id
private String id;
// for the next 3 fields there are no public acessors, so the public API of the class was not changed !
@Id
@Column(name = "PROJECT")
private String projectId;
@Id
@Column(name = "PERMISSIONCONTEXTTYPE")
private String permissionContextTypeId;
@Id
@Column(name = "PERMISSIONCONTEXT")
private String permissionContextId;
@JoinColumns ({
@JoinColumn (name = "PROJECT", referencedColumnName = "PROJECT", updatable = false, insertable = false),
@JoinColumn (name = "PERMISSIONCONTEXTTYPE", referencedColumnName = "PERMISSIONCONTEXTTYPE", updatable = false, insertable = false),
@JoinColumn (name = "PERMISSIONCONTEXT", referencedColumnName = "ID", updatable = false, insertable = false)
})
@ManyToOne
private PermissionContext permissionContext;
public static class PermissionPk implements Serializable{
// previously they where private as well, but removed public constructor for the sake of simplicity of the question - so no changes where necesary in public API of the class !
private String id;
private String projectId;
private String permissionContextTypeId;
private String permissionContextId;
public PermissionPk () {}
public PermissionPk (String aId, PermissionContextPk aPermissionContext) {
this.id = aId;
permissionContextId = aPermissionContext.id;
permissionContextTypeId = aPermissionContext.permissionContextType.id;
projectId = aPermissionContext.permissionContextType.project;
}
... eq and hashCode here ...
}
}
这种解决方法的好处是它不会以任何方式更改类的公共API
(唯一的变化是,我需要使PermissionPk可以看到上下文和上下文类型Pk中的字段-它们以前是私有的,只有一个公共构造函数(但再次简化了这个问题)),也没有改变jpql查询,同时,解决方法是可扩展的(可以扩展到任何级别-只要每个偶数Pk都不包含另一个Pk),因此,如果这个bug能够得到解决,那么很容易删除解决方法。
我仍然很乐意接受对我的解决方法或问题本身的任何评论。