我在实体 RTask
中使用了 @Embeddable
REmbeddedReference
两次。该嵌入包含 QName 属性,其类型定义为 org.hibernate.usertype.UserType。
@Embeddable
public class REmbeddedReference implements Serializable {
private String targetOid;
private String description;
private String filter;
private RContainerType type;
private QName relation;
@Columns(columns = {
@Column(name = "relation_namespace"),
@Column(name = "relation_localPart")
})
public QName getRelation() { return relation; }
@Column(length = 36, insertable = true, updatable = true, nullable = true)
public String getTargetOid() { return targetOid; }
@Type(type = "org.hibernate.type.TextType")
public String getDescription() { return description; }
@Enumerated(EnumType.ORDINAL)
public RContainerType getType() { return type; }
@Type(type = "org.hibernate.type.TextType")
public String getFilter() { return filter; }
...setters...
}
RTask
看起来像这样:
@Entity
@ForeignKey(name = "fk_task")
public class RTask extends RObject {
private REmbeddedReference objectRef;
private REmbeddedReference ownerRef;
...other fields...
@Embedded
public REmbeddedReference getObjectRef() {
return objectRef;
}
@Embedded
public REmbeddedReference getOwnerRef() {
return ownerRef;
}
...other methods...
}
在启动过程中我得到:
由以下原因引起:org.hibernate.MappingException:实体映射中的重复列:com.evolveum.midpoint.repo.sql.data.common.RTask列:relation_namespace(应使用 insert="false"update="进行映射假”)
我尝试更新我的 NamingStrategy、生成 objectRef_relation_namespace 和ownerRef_relation_namespace 的方法 LogicalColumnName。但后来我得到:
引起:org.hibernate.DuplicateMappingException:表[m_task]包含由不同逻辑列名称表示的物理列名称[relation_namespace]:[objectRef_relation_namespace],[ownerRef_relation_namespace]
您知道如何正确映射REmbeddedReference
中的属性relation
吗?
最佳答案
解决方案:
@AttributeOverride(name="relation.namespace", column=@Column(name="object_namespace")
@AttributeOverride(name="relation.localPart", column=@Column(name="object_localpart")
@Embedded
public REmbeddedReference getObjectRef() {
return objectRef;
}
@AttributeOverride(name="relation.namespace", column=@Column(name="owner_namespace")
@AttributeOverride(name="relation.localPart", column=@Column(name="owner_localpart")
@Embedded
public REmbeddedReference getOwnerRef() {
return ownerRef;
}
没用。我必须将 QName
类型实现从 CompositeUserType
更改为另一个可嵌入实体 RQName
,它在可嵌入的 REmbeddedReference
中表示此属性。
关于hibernate - 可嵌入在实体中使用两次的自定义 UserType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11289865/