이것은 내가 바꿀 수없는 구조를 가진 레거시 시스템으로 작업하고 있다는 사실에서 생겨난 이상한 시나리오입니다.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)
고유하지 않으려면 여러 요소가 해당 구성을 가질 수 있습니다.
그래서를 내가 엔티티에 ElementCategory을하고 (잘되는) 데이터베이스 내 데이터를 저장했다이 문제에 대한 답을 찾을 수 시작하지 않고 관계를 ManyToMany 관계로 만들었고 Hibernate는 여전히 타입과 값 쌍에 대한 유일한 제약 조건을 가진 My Element 테이블을 생성합니다. 나는 그것이 "Many to Many"와 어떻게 다른지 이해할 수 없으며, 그것을 끌 수있는 방법을 찾아 낼 수 없다. 도와주세요? – Link19
ElementCategory 엔티티에 id 속성을 추가해도 여전히 uniqueconstraint가 생성됩니까? – bvanvelsen
예, @ id로 주석을 단 id 속성이 이미 있습니다. 한 요소 만 특정 쌍을 가질 수 있다고 결정되면 이것이 많은 관계가되는 방법을 알지 못합니까? – Link19