2012-07-02 2 views
1

@EmbeddableREmbeddedReference을 두 번째 엔티티 RTask에 두 번 사용하고 있습니다. 이 임베디드에는 QName 속성이 있으며이 유형은 org.hibernate.usertype.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... 
} 

내가 얻을 : Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.evolveum.midpoint.repo.sql.data.common.RTask column: relation_namespace (should be mapped with insert="false" update="false")

내의 NamingStrategy, objectRef_relation_namespace 및 ownerRef_relation_namespace 생성 방법 logicalColumnName을 업데이트했습니다. 하지만 내가 얻을 : Caused by: org.hibernate.DuplicateMappingException: Table [m_task] contains phyical column name [relation_namespace] represented by different logical column names: [objectRef_relation_namespace], [ownerRef_relation_namespace]

제대로 REmbeddedReference 재산 relation를 매핑하는 방법에 어떤 생각을 가지고 있습니까?

+0

대답을 얻으려면 http://stackoverflow.com/questions/331744/jpa-multiple-embedded-fields – JMelnik

+0

'DefaultComponentSafeNamingStrategy'에 대해 알고 있지만'REmbeddedReference'에서'@ Columns'을 제거하면 얻을 수 있습니다.' 원인 : org.hibernate.MappingException : 속성 매핑의 열 수가 잘못되었습니다. com.evolveum.midpoint.repo.sql.data.common.RTask.objectRef type : component [description, filter, relation, targetOid, type]'때문에 그 QName (사용자 정의 사용자 유형) 필드'관계'는 두 개의 열로 표현되어야합니다 ... – viliam

+0

당신의 embeddable에 열 정의가 있습니다. 분명히 테이블에 같은 이름을 가진 두 개의 열을 가질 수는 없습니다. 제공된 링크에서 두 번째 게시물을보십시오. @AttributeOverride를 사용하여 열의 이름을 적절하게 지정할 수 있어야합니다. – jeff

답변

1

솔루션 :

@AttributeOverride(name="relation.namespace", [email protected](name="object_namespace") 
@AttributeOverride(name="relation.localPart", [email protected](name="object_localpart") 
@Embedded 
public REmbeddedReference getObjectRef() { 
    return objectRef; 
} 

@AttributeOverride(name="relation.namespace", [email protected](name="owner_namespace") 
@AttributeOverride(name="relation.localPart", [email protected](name="owner_localpart") 
@Embedded 
public REmbeddedReference getOwnerRef() { 
    return ownerRef; 
} 

작동하지 않았다. QName 형식 구현을 CompositeUserType에서 다른 구현 가능 엔터티 RQName으로 변경해야합니다 (이 속성은 REmbeddedReference 임베드 가능).

관련 문제