2014-11-17 1 views
3

Моей проблема заключается в том, что у меня есть весна модельИспользуйте абстрактный класс для переменного экземпляра в Spring

@Entity 
public class PetOwner { 
    @ManyToOne 
    @JoinColumn(name = "pet_id", nullable = true) 
    private Pet pet; 

с домашним животным является абстрактным классом с 2 подклассов для собак и кошек.

@Entity 
@Inheritance(strategy= InheritanceType.JOINED) 
public abstract class Pet { 
    @OneToMany(fetch = FetchType.LAZY) 
    protected Set<PetOwner> owners; 
} 

@Entity 
public class Cat extends Pet 

@Entity 
public class Dog extends Pet 

Когда я создать новую PetOwner в Struts-форме и попытаться связать его питомец любой собакой или объект Cat, я получаю ошибку на подачу вида:

Error creating bean with name 'de.model.Pet': Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [de.model.Pet]: Is it an abstract class?; 
nested exception is java.lang.InstantiationException 

Как может Я говорю Spring, чтобы инициализировать de.model.Dog или de.model.Cat на основе класса pet-объекта?

FYI: У меня есть PetDAO и PetService, но я не уверен, влияют ли они на эту проблему.

Я ценю каждую помощь!

+0

* Моя проблема в том, что у меня есть модель весны *. Но я не вижу, как здесь участвует Весна. –

+0

Может ли это помочь вам http://stackoverflow.com/questions/8119678/jpa-entity-inheritance-with-abstract-classes-constrainviolationexception – Aeseir

ответ

1

Лично я бы превратить Pet к Interface и сделать Cat и Dog реализовать его, чтобы избежать такого рода проблем. Извините за неточность!

Во всяком случае, если вы хотите, чтобы какой-либо член вашего класса был динамически инициализирован \ заполнен, попробуйте метод поиска метода поиска. Читайте стр. 3.3.4.1 here.

Если класс, содержащий динамический элемент, был создан в scope = singleletone (по умолчанию для контейнера для весеннего боба) каждый раз, когда вы будете получать доступ к полю, у которого есть метод поиска, вы получите соответствующий объект в соответствии с бизнес- логики, реализованной внутри метода поиска.

Кроме того, я нашел это example весной документации - я думаю, что это очень ясно. Взгляните на «3.4.6.1 Поиск метода инъекции»

При настройке класса PetOwner назначьте метод поиска его члену Pet - он будет вызываться всякий раз, когда вам понадобится новый экземпляр компонента «Любитель».

Удачи вам!

+0

Я использовал AbstractClass, потому что я хочу создать двунаправленное сопоставление между 'Pet' и #PetOwner ', который, я должен признать, я не указывал в фрагменте выше предыдущего. Насколько я понимаю, мне пришлось бы использовать отношение @ManyToAny от PetOwner к Pet, которое не может быть двунаправленным. –

Смежные вопросы