Сохранение коллекции интерфейса с использованием Hibernate - PullRequest
29 голосов
/ 26 мая 2010

Я хочу сохранить свой маленький зоопарк с Hibernate:

@Entity
@Table(name = "zoo") 
public class Zoo {
    @OneToMany
    private Set<Animal> animals = new HashSet<Animal>();
}

// Just a marker interface
public interface Animal {
}

@Entity
@Table(name = "dog")
public class Dog implements Animal {
    // ID and other properties
}

@Entity
@Table(name = "cat")
public class Cat implements Animal {
    // ID and other properties
}

Когда я пытаюсь сохранить зоопарк, Hibernate жалуется:

Use of @OneToMany or @ManyToMany targeting an unmapped class: blubb.Zoo.animals[blubb.Animal]

Я знаю о targetEntity -свойстве @OneToMany, но это означало бы, что только собаки или кошки могут жить в моем зоопарке.

Есть ли способ сохранить коллекцию интерфейса, имеющего несколько реализаций, в Hibernate?

Ответы [ 3 ]

27 голосов
/ 27 мая 2010

JPA аннотации не поддерживаются на интерфейсах. От Сохранение Java с Hibernate (с.210):

Обратите внимание, что спецификация JPA не поддерживает аннотацию сопоставления на интерфейсе! Это будет решено в будущей версии Спецификация; когда ты читаешь это книга, это, вероятно, будет возможно с аннотациями в спящем режиме.

Возможным решением было бы использование абстрактной сущности с TABLE_PER_CLASS стратегией наследования (потому что вы не можете использовать сопоставленный суперкласс - который не является сущностью - в ассоциациях). Примерно так:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractAnimal {
    @Id @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
    ...
}

@Entity
public class Lion extends AbstractAnimal implements Animal {
    ...
}

@Entity
public class Tiger extends AbstractAnimal implements Animal {
    ...
}

@Entity
public class Zoo {
    @Id @GeneratedValue
    private Long id;

    @OneToMany(targetEntity = AbstractAnimal.class)
    private Set<Animal> animals = new HashSet<Animal>();

    ...
}

Но в сохранении интерфейса IMO нет особых преимуществ (и, на самом деле, я думаю, что постоянные классы должны быть конкретными).

Ссылки

1 голос
/ 26 мая 2010

Я могу догадаться, что вам нужно отображение дерева наследования. @ Наследование аннотации путь. Я не знаю, будет ли он работать с интерфейсами, но он определенно будет работать с абстрактными классами.

0 голосов
/ 05 июня 2010

Я думаю, что вы также должны аннотировать интерфейс с помощью @Entity, и мы должны аннотировать @Transient на всех методах получения и установки интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...