Hibernate / JPA Mapping на абстрактный класс - PullRequest
5 голосов
/ 08 марта 2011

Что было бы наилучшим решением для реализации следующей ситуации с Hibernate.

Мы определяем абстрактный класс, который станет основой любого объекта, который мы хотим сохранить в нашей базе данных.Он содержит идентификатор и т. Д. И т. Д. *

public abstract class ModelObject {
    protected int id;

    ...
}

Теперь мы создадим подкласс нашего базового предложения для особых случаев, когда более чем у одной сущности будут одинаковые поля.все классы, которые мы хотим иметь Nose:

public class Person extends ModelObjectWithNose { ... }

public class Animal extends ModelObjectWithNose { ... }

Реальная проблема, с которой мы сталкиваемся сейчас, заключается в том, что эти отношения должны быть двунаправленными.Каждый конкретный класс должен знать, какой Nose является их собственным, но каждый Nose также должен знать, к какому объекту он принадлежит.

public class Nose {
    ...
    private ModelObjectWithNose owner;
}

Для нашего примера нам нужны отношения @OneToOne, так как каждыйPerson может иметь только один Nose, и каждый Nose может принадлежать только одному Person.

. Мы попытались сделать следующее:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class ModelObjectWithNose extend ModelObject { ... }

, а затем:

@Entity
public class Person extends ModelObjectWithNose { ... }

... и т. Д. И т. Д.

1) Как определить отношение между Nose и ModelObjectWithNose?Это так же просто, как:

@Entity
public class Nose {
    ...
    // this causes: 'Basic' attribute should not be 'Persistence Entity' 
    ModelObjectWithNose owner;
}

2) Есть ли лучший / более предпочтительный способ?Будет ли стратегия наследования работать правильно?

Спасибо!

РЕДАКТИРОВАТЬ

Итак, я попробовал несколько способов, которые, кажется, все потенциально работают.Использование любой из трех схем наследования работает нормально, если вы настроили аннотации, как в вопросе.К сожалению, это оказывает огромное влияние на нашу существующую базу данных и код, поэтому мы решили (на данный момент) просто проиндексировать поле Nose объекта id, которое хранится в наших текущих объектах, которые расширили бы ModelObjectWithNose, и просто написать помощникметоды выполнения точечных запросов для поиска записей.

1 Ответ

1 голос
/ 10 марта 2011

Аннотируйте вашу Nose собственность в ModelObjectWithNose как @OneToOne, а в Nose вы делаете то же самое с ModelObjectWithNose owner.Установите атрибут mappedBy для аннотации объекта Nose, чтобы JPA знал, к какой таблице следует добавить FK (в вашей модели ModelObjectWithNose должен иметь FK на Nose, а не наоборот.установите его на обратном конце отношения один-к-одному, т. е. тот, который имеет PK для использования.)

Кстати, ваши сущности должны реализовать Serializable (вы можете сделать это на ModelObject класс для обеспечения его наследования классов).Свойство id ModelObject должно быть аннотировано как @Id.

Cheers, Kai

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