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
관계에 대한 사용자 지정 조인을 처리하는 방법 O
및 ResourceObjectShadow
에 있습니까? 프로그래밍 방식으로 (예 : 사용자 정의 tuplizer 또는 이와 유사한 방식으로) 수행하는 방법이 있습니까? 여러 열을 기반으로 조인 할 때이 같은 매핑을 만들려면
나는'O.extension' 매핑에'@Formula (".. some hql ..")'을 추가하려했지만, 원하는대로 사용하지 않았고,'AnyContainer'는 여전히'owner_oid'와 'owner_id','ownerType'은 사용되지 않았습니다. @OneToOne 주석을 삭제할 수 있습니까? 어떻게 든이 관계는 Tuplizer 등을 통해 프로그래밍 방식으로 매핑 될 수 있습니까? – viliam
주석이있는 예제를 찾을 수 없습니다. [this] (http://stackoverflow.com/questions/2334676/hibernate-many-to-one-using-formula)가 도움이되는지 확인하십시오. – ManuPK