Сохранитесь набор интерфейсного использования В спящем режиме

Я хочу сохраниться, мой litte зоопарк с Будьте в спящем режиме:

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

То, когда я пытаюсь сохранить зоопарк, Быть в спящем режиме, жалуется:

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

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

Там какой-либо путь состоит в том, чтобы сохранить набор интерфейса, который имеет несколько реализаций, с В спящем режиме?

29
задан Olvagor 26 May 2010 в 12:39
поделиться

3 ответа

Аннотации JPA не поддерживаются в интерфейсах. Из Java Persistence with Hibernate (стр.210):

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

Возможным решением было бы использование абстрактного Entity с 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 (и вообще, я думаю, что постоянные классы должны быть конкретными).

Ссылки

27
ответ дан 28 November 2019 в 02:03
поделиться

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

1
ответ дан 28 November 2019 в 02:03
поделиться

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

0
ответ дан 28 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: