2012-02-09 4 views
2

Это странный сценарий, связанный с тем, что я работаю с устаревшей системой, структуру которой я не могу изменить.Hibernate/JPA Коллекция элементов со многими для многих отношений?

Сценарий заключается в том, что у меня есть таблица Element, которая содержит различные данные об элементе с важными полями «type» и «value».

Различные комбинации типа и значения классифицируются. Например, все элементы типа 2 и значение «зеленый» относятся к категории 1.

Я создаю пользовательский интерфейс для устаревшей системы, которая позволяет пользователям определять эти категории с учетом типа и значения (очевидно) , Я хочу, чтобы унаследованная система включала набор категорий в свой спящий Entity. Категория на самом деле представляет собой перечисление типа ElementCategory, одна из моих задач заключается в том, что устаревшее приложение должно быть таким, чтобы определить мою схему, поэтому мне нужно собрать мои таблицы, когда я его запустил. и затем я использую эту базу данных , когда создаю свой новый интерфейс. Вот как я аннотированный свою новую коллекцию в моем Element Entity:

@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))); 
} 

}

отображение этого в моем классе Element Entity, как это:

@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 $ во всем магазине, но сгенерированные таблицы по-прежнему заканчиваются этим в моей таблице Element:

CONSTRAINT element_type_value_key UNIQUE (type , value) 

Я не хочу, чтобы он был уникальным, несколько элементов могут иметь такую ​​конфигурацию.

+0

Так не начать в состоянии найти ответ на этот вопрос, я должен был сделать ElementCategory в к сущности и хранить свои данные в базе данных (это хорошо) I сделал связь с ManyToMany, а Hibernate все еще создает мою таблицу Element с уникальным ограничением пары типов и значений. Я не понимаю, как это соответствует «Многим многим», и я не могу понять, как отключить его. Пожалуйста помоги? – Link19

+0

все еще делает uniqueconstint, если вы добавите свойство id в элемент ElementCategory? – 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

Извините, я не понимаю этого, мои категории даны Elements на основе пары «value» и «type» в Element, как ваш ответ достигает этого? – Link19

+0

Это лучше описывает мою новую проблему: http://stackoverflow.com/questions/9228005/hibernate-jpa-many-to-many-relationship-through-a-join-table-and-a-composite-k – Link19

Смежные вопросы