hibernate - 可嵌入在实体中使用两次的自定义 UserType

标签 hibernate annotations embeddable

我在实体 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/

相关文章:

java - Hibernate @Embeddable 类对于未引用的列抛出 "SQLServerException: Invalid column name"

java - 无法使用 Spring、Hibernate 和 c3p0 创建 dataSource bin

java - 如何使用接口(interface)声明 DAO 变量,但在 Spring 框架中放入具体实现?

java - JPA + Hibernate - 如何在不获取该实体的情况下获取子实体的 FK?

c++ - 使用纯 C/C++ 添加注释到 PDF

doctrine-orm - 如何使用 Doctrine Embeddables

spring - 为什么在使用 Spring Boot 时我需要实体可序列化?

spring - 是否可以将系统路径设置为 spring 上下文

java - 将类引用传递给注入(inject)实例的更好方法

JPA/Hibernate OneToMany 映射,使用复合 PrimaryKey