Сопоставление расширенных объектов с несколькими идентификаторами в Hibernate

Я реализовал базу данных, состоящую из таблиц Article и Fruit, со следующими характеристиками:

create table Fruit
(
ART_ID            bigint,
FRU_ID          bigint not null auto_increment,
FRU_FROZEN   varchar(15),
primary key(FRU_ID)
);

# Implemented

create table Article
(
ART_ID            bigint,
ART_NAME         varchar(10) not null,
ART_COST   varchar(10) not null,
primary key(ART_ID)
);

изменить таблицу Fruits добавить ограничение FK_FRUIT_ARTICLE внешний ключ (ART_ID) ссылается на статью (ART_ID) при ограничении удаления при ограничении обновления;

и со следующими сущностями класса: Article.java

@Entity      
@Table(name = "Article")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Article implements Serializable
 {
@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Basic(optional = false)
@Column(name = "ART_ID")
private Long id;

@Basic(optional = false)
@Column(name = "ART_NAME")
private String name;

@Basic(optional = true)
@Column(name = "ART_COST")
private String cost; 

// конструкторы, геттеры и сеттеры

Fruit.java

@Entity
@Table(name="Fruit")
public class Fruit extends Article{


@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "FRU_ID")
private long fruitID;

@Basic(optional = false)
@Column(name = "FRU_FROZEN")
private String fruitFrozen;

// конструкторы, геттеры и сеттеры

Теперь моя проблема заключается в том, как иметь идентификатор в статье и во фруктах, если я оставлю его таким, он выдает мне исключение, что подкласс не должен содержать IDClass, потому что это приведет к нескольким идентификаторам. Любая помощь приветствуется. Заранее спасибо.


person Serenity Stack Holder    schedule 04.05.2012    source источник


Ответы (1)


Это означает то, что он говорит, сущность не может иметь два идентификатора.

Рассмотрим операцию

entityManager.find(Article.class, 1l);

Как узнать, какой из них вернуть, если есть две статьи (статья и фрукт), обе из которых имеют идентификатор 1?

Если ваши таблицы должны иметь идентификаторы, наследование сущностей не является подходящим решением. Вместо этого подумайте о том, чтобы поместить общие элементы в @MappedSuperclass.

person Affe    schedule 04.05.2012
comment
Если я определю @MappedSuperClass, это будет означать, что статья является абстрактной, и я не хочу, чтобы это произошло. Почему я не могу иметь два идентификатора в одном объекте? Если я объявлю один экземпляр статьи, он получит ID1, а если я объявлю другой экземпляр Fruit позже, он получит ID2 и FRU_ID1. Почему так сложно разобраться? - person Serenity Stack Holder; 05.05.2012
comment
Потому что он оставляет findById неопределенным. Если у плода есть два идентификатора, какой из них должен использоваться спящим режимом для его поиска? - person Affe; 05.05.2012
comment
Ну, а как насчет его первичного ключа? ART_ID в таблице Fruit — это просто вторичный ключ, который связывает свойства статьи с экземпляром Fruit. - person Serenity Stack Holder; 05.05.2012
comment
Это просто не работает, извините. Это не то, как Hibernate реализует EntityInheritance. Чтобы использовать EntityInheritance, должен быть один идентификатор, уникальный среди всех подклассов. - person Affe; 05.05.2012
comment
Наследование сущностей почти никогда не является подходящим решением, если у вас есть разработанная база данных, на основе которой вы пытаетесь построить модель гибернации, а не создавать естественную модель предметной области в Java и иметь схему БД. генерируется фреймворком. - person Affe; 05.05.2012
comment
Так что мне придется определить @MappedSuperClass над статьей? Я больше ничего не могу с этим поделать, не так ли? Еще одно замечание: если я объявлю класс Article с аннотацией MappedSuperclass, тогда не будет никаких исключений.... - person Serenity Stack Holder; 05.05.2012
comment
Кроме того, теперь мне нужно будет определить каждую сущность со свойствами из сущности статьи с наследованием JOINED. - person Serenity Stack Holder; 05.05.2012