Hibernate / JPA Коллекция элементов со многими ко многим отношениям? - PullRequest
2 голосов
/ 09 февраля 2012

Это странный сценарий, связанный с тем, что я работаю с устаревшей системой, структуру которой я не могу изменить.

Сценарий состоит в том, что у меня есть таблица Элементов, которая содержит различные данные об элементе с важными полями "тип" и "значение".

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

Я встраиваю пользовательский интерфейс в унаследованную систему, которая позволяет пользователям определять эти категории с учетом типа и значения (очевидно). Я хочу, чтобы устаревшая система включала набор категорий в свою спящую сущность. Категория на самом деле - это Enum типа 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
@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)));
}

}

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

CONSTRAINT element_type_value_key UNIQUE (type , value )

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

1 Ответ

0 голосов
/ 10 февраля 2012

вы можете попробовать что-то вроде этого:

@JoinTable(name = "Element_Category",
joinColumns = {@JoinColumn(name = "type_id") },
inverseJoinColumns = { @JoinColumn(name = "elementcategory_id") }
)
public List<ElementCategory> getCategories() {
    return categories;
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...