Это странный сценарий, связанный с тем, что я работаю с устаревшей системой, структуру которой я не могу изменить.
Сценарий состоит в том, что у меня есть таблица Элементов, которая содержит различные данные об элементе с важными полями "тип" и "значение".
Различные комбинации типа и значения классифицируются. Например, все элементы типа 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 )
Я не хочу, чтобы он был уникальным, такая конфигурация может быть у нескольких элементов.