2012-02-09 3 views
2

이것은 내가 바꿀 수없는 구조를 가진 레거시 시스템으로 작업하고 있다는 사실에서 생겨난 이상한 시나리오입니다.Hibernate/JPA many to many 관계가있는 요소 컬렉션?

중요한 시나리오 인 "유형"및 "값"이있는 요소에 대한 다양한 데이터가 포함 된 요소 테이블이 있다고 가정합니다.

유형 및 값의 다양한 조합이 범주화됩니다. 예를 들어, 유형 2의 모든 요소와 값 "녹색"은 범주 1에 속합니다.

사용자가 유형 및 값이 주어진 카테고리를 정의 할 수있게 해주는 사용자 인터페이스를 레거시 시스템에 구축하고 있습니다 (분명히) . 내가 원하는 것은 레거시 시스템이 최대 절전 모드 엔티티에 일련의 범주를 포함시키는 것입니다. Category는 실제로 ElementCategory 유형의 열거 형입니다. 나의 승인 중 하나는 레거시 앱이 필자의 스키마를 정의해야만 테이블을 빌드 할 필요가 있기 때문입니다. 그런 다음 새 프런트 엔드를 만들 때 해당 데이터베이스 을 사용합니다. 여기에 내가 내 요소 엔티티 내에서 내 새 컬렉션을 주석 한 방법은 다음과 같습니다

@CollectionOfElements(fetch=FetchType.EAGER,targetElement = ElementCategory.class) 
@JoinTable(name = "Element_Category",joinColumns = 
    {@JoinColumn(name = "type", referencedColumnName="type" 
    @JoinColumn(name = "value", referencedColumnName="value")   
    }) 
@Column(name="category") 
@Enumerated(EnumType.STRING) 
public List<ElementCategory> getCategories() { 
    return categories; 
} 

문제는 내가 서버를 발사 할 때 만들어지는 요소 테이블이 올바르지 않습니다 (유형, 값)에 고유 제한 조건을 가지고 있다는 것입니다 동일한 유형 및 값 필드를 가진 여러 개의 요소가있을 수 있으며 element_category 테이블의 모양에 따라 동일한 범주 또는 범주에 속합니다.

많은 요소가 많다는 것을 알고 있지만, 요소 카테고리 필드에 범주 엔터티 컬렉션이 포함되어 있지 않으면 많은 것을 사용합니다. 그러나 열거 형 집합이 아닙니다. .

최대 절전 모드로 구현할 수 있습니까?

이 문제에 이어 나는 다른 접근을 시도하고 ElementCategory 엔티티를 생성 :이처럼 내 요소 Entity 클래스에서

@Entity 
@Table(name="ElementCategory") 
public class ElementCategory implements Serializable{ 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue 
private int id; 

private String description; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id =id; 
} 


public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 


/* (non-Javadoc) 
* @see java.lang.Object#hashCode() 
*/ 
@Override 
public int hashCode() { 
    int hash = 1; 
    hash = hash * (17 + id); 
    hash = hash * 31 + description.hashCode(); 
    return hash; 
} 

/* 
* (non-Javadoc) 
* @see java.lang.Object#equals(java.lang.Object) 
*/ 
@Override 
public boolean equals(Object obj) { 
    if(this == obj) { 
     return true; 
    } 
    if(!super.equals(obj)) { 
     return false; 
    } 
    if(getClass() != obj.getClass()) { 
     return false; 
    } 
    ElementCategory other = (ElementCategory)obj; 

    return ((other.id == id) && (this.description.equals(other.description))); 
} 

}

매핑이 : 내가 가진

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "ELEMENT_ELEMENTCATOGORY", joinColumns = { 
     @JoinColumn(name = "type", referencedColumnName = "type"), 
     @JoinColumn(name = "value", referencedColumnName = "value") }) 
@Column(name = "category") 
public List<ElementCategory> getCategories() { 
    return categories; 
} 

상점에 $ unique = false $를 넣으려고 시도했지만 생성 된 테이블은 여전히 ​​내 요소 테이블에서 이걸로 끝납니다 :

CONSTRAINT element_type_value_key UNIQUE (type , value) 

고유하지 않으려면 여러 요소가 해당 구성을 가질 수 있습니다.

+0

그래서를 내가 엔티티에 ElementCategory을하고 (잘되는) 데이터베이스 내 데이터를 저장했다이 문제에 대한 답을 찾을 수 시작하지 않고 관계를 ManyToMany 관계로 만들었고 Hibernate는 여전히 타입과 값 쌍에 대한 유일한 제약 조건을 가진 My Element 테이블을 생성합니다. 나는 그것이 "Many to Many"와 어떻게 다른지 이해할 수 없으며, 그것을 끌 수있는 방법을 찾아 낼 수 없다. 도와주세요? – Link19

+0

ElementCategory 엔티티에 id 속성을 추가해도 여전히 uniqueconstraint가 생성됩니까? – bvanvelsen

+0

예, @ id로 주석을 단 id 속성이 이미 있습니다. 한 요소 만 특정 쌍을 가질 수 있다고 결정되면 이것이 많은 관계가되는 방법을 알지 못합니까? – Link19

답변

0

이 뭔가를 시도 할 수 :

@JoinTable(name = "Element_Category", 
joinColumns = {@JoinColumn(name = "type_id") }, 
inverseJoinColumns = { @JoinColumn(name = "elementcategory_id") } 
) 
public List<ElementCategory> getCategories() { 
    return categories; 
} 
+0

죄송합니다. 이해가 안되네요. 내 범주는 요소의 "값"과 "유형"쌍을 기반으로 요소에 주어집니다. 어떻게 대답합니까? – Link19

+0

내 새로운 문제에 대해 더 잘 설명합니다. http://stackoverflow.com/questions/9228005/hibernate-jpa-many-to-many-relationship-through-a-join-table-and-a-composite-k – Link19