2012-03-13 3 views
0

OneToOne 관계에 대한 사용자 지정 조인 쿼리를 갖고 싶습니다. 부품이 없으면 하나만 더 추가해야합니다. More than one row with the given identifier was found: [email protected], for class: com.example.AnyContainer 그렇게 할 수 있습니까?OneToOne 사용자 지정 조인 쿼리

Container.java

@Entity 
@Table(name = "container") 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class Container implements Serializable { 

    private String oid; 
    private Long id; 

    @Id 
    @GeneratedValue(generator = "ContainerIdGenerator") 
    @GenericGenerator(name = "ContainerIdGenerator", strategy = "com.example.ContainerIdGenerator") 
    @Column(name = "id") 
    public Long getId() { 
     return id; 
    } 

    @Id 
    @GeneratedValue(generator = "OidGenerator") 
    @GenericGenerator(name = "OidGenerator", strategy = "com.example.OidGenerator") 
    @Column(unique = true, nullable = false, updatable = false, length = 36) 
    public String getOid() { 
     return oid; 
    } 
    ..other getters/setters 
} 

O.java : Hibernate는 select c.ownerType, c.owner_oid, c.owner_id from any c where c.owner_oid=? and c.owner_id=? 쿼리를 사용하지만 나는 여기로 쿼리를 조인이 from AnyContainer as c where c.owner = ? and c.ownerType = 0 같은 것을 사용하고 싶습니다. 그리고 ? 평소처럼 주인이 있어야합니다. Hibernate는 select c.ownerType, c.owner_oid, c.owner_id from any c where c.owner_oid=? and c.owner_id=? 쿼리를 사용하지만 나는 여기로 쿼리를 조인이 from AnyContainer as c where c.owner = ? and c.ownerType = 1 같은 것을 사용하려면 :>ownerType = 0

@Entity 
@Table(name = "object") 
@ForeignKey(name = "fk_container") 
public abstract class O extends Container { 

    private AnyContainer extension; 

    @OneToOne(optional = true, mappedBy = "owner") 
    @ForeignKey(name = "none") 
    @Cascade({org.hibernate.annotations.CascadeType.ALL}) 
    public AnyContainer getExtension() { 
     return extension; 
    } 
    ...other getters/setters 
} 

ResourceObjectShadow.java - 내가 거기 또 하나 개의 조건을 추가했다. 그리고 ? 평소처럼 주인이 있어야합니다. 나는 거기에 추가 하나 더 상태 ->ownerType = 1

@Entity 
@Table(name = "resource_shadow") 
@ForeignKey(name = "fk_resource_object_shadow") 
public class ResourceObjectShadow extends O { 

    private AnyContainer attributes; 

    @OneToOne(optional = true, mappedBy = "owner") 
    @Cascade({org.hibernate.annotations.CascadeType.ALL}) 
    public AnyContainer getAttributes() { 
     return attributes; 
    } 
    ...other getters/setters 
} 

@Entity 
@Table(name = "any") 
public class AnyContainer implements Serializable { 

    private RContainerType ownerType; 
    private Container owner; 

    @ForeignKey(name = "fk_reference_owner") 
    @MapsId("owner") 
    @OneToOne(fetch = FetchType.LAZY) 
    @PrimaryKeyJoinColumns({ 
      @PrimaryKeyJoinColumn(name = "owner_oid", referencedColumnName = "ownerOid"), 
      @PrimaryKeyJoinColumn(name = "owner_id", referencedColumnName = "id") 
    }) 
    public Container getOwner() { 
     return owner; 
    } 
    ..other getters/setters 
} 

RContainerType.java

public enum RContainerType { 
    O, RESOURCE_OBJECT_SHADOW 
} 

편집 : ManyToOne 업데이트 -> I 클래스 O에 주석 명명 된 쿼리와 사용자 @Loader에 노력 OneToOne AnyContainer에서하고 ResourceObjectShadow이지만 사용되지 않았습니다. 또한 AnyContainer 클래스에서 사용하기위한 테스트로 만 시도했지만 전혀 사용되지 않았습니다.

해당 OneToOne 관계에 대한 사용자 지정 조인을 처리하는 방법 OResourceObjectShadow에 있습니까? 프로그래밍 방식으로 (예 : 사용자 정의 tuplizer 또는 이와 유사한 방식으로) 수행하는 방법이 있습니까? 여러 열을 기반으로 조인 할 때이 같은 매핑을 만들려면

답변

0

당신은 당신이 formula 태그를 사용할 수 있습니다, 지금 HQL

from AnyBean as a join a.b with b.type = 0 

with 연산자를 사용할 수 있습니다.

<one-to-one name="one2oneSubRef" 
class="com.manu.hibernate.mappings.domain.RefOnlyAMain" property-ref="parentARef" 
      cascade="all" > 

<formula>'A'</formula> 

<formula>a_id</formula> 

</one-to-one> 

이 매핑은 항상 두 개의 열을 기반으로 테이블을 결합합니다.

예 : here 또는 API 문서 here 읽기

+0

나는'O.extension' 매핑에'@Formula (".. some hql ..")'을 추가하려했지만, 원하는대로 사용하지 않았고,'AnyContainer'는 여전히'owner_oid'와 'owner_id','ownerType'은 사용되지 않았습니다. @OneToOne 주석을 삭제할 수 있습니까? 어떻게 든이 관계는 Tuplizer 등을 통해 프로그래밍 방식으로 매핑 될 수 있습니까? – viliam

+0

주석이있는 예제를 찾을 수 없습니다. [this] (http://stackoverflow.com/questions/2334676/hibernate-many-to-one-using-formula)가 도움이되는지 확인하십시오. – ManuPK