Лучший способ поделиться реализацией Java между конкретными классами JPA? - PullRequest
0 голосов
/ 04 июля 2010

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

Если бы я мог, я бы поместил все различные поля и коллекции в этот абстрактный суперкласс и поэтому поместил там и методы реализации - все в одном месте вместо 10. Однако из-за ограничений JPA я не могу добавьте аннотации JPA к общим полям или методам доступа.

Хотя в любом случае я обычно отдаю предпочтение делегированию наследования реализации, из-за другого ограничения JPA, согласно которому нельзя иметь встроенную сущность с коллекцией, идея использования делегата также не будет работать.

Когда у меня было только 3-4 таких объекта и 2-3 метода, это было не страшно, но теперь у меня есть около 10 - и около 7-8 методов каждый ... и некоторые методы становятся действительно сложными. И наследование «вырезать-копировать-вставить», которое я использую, действительно отстой.

Есть еще какие-нибудь блестящие идеи?

Ответы [ 2 ]

1 голос
/ 04 июля 2010
  1. Дважды проверьте, действительно ли эти «ограничения» справедливы для вашего провайдера JPA. У меня были встроенные объекты с коллекциями, и это было хорошо (с Hibernate). И у меня было @MappedSuperclass с сопоставленными полями.

  2. Вы можете попробовать опустить @MappedSuperclass и сделать суперкласс abstract и @Entity с правильной иерархией наследования.

0 голосов
/ 06 июля 2010

Оказывается, вы можете использовать наследование реализации или делегирование, если вы уверены, что используете режим доступа к свойству для своих аннотаций JPA. Я использовал режим доступа к полям для аннотаций JPA, и это не приносило мне бесконечных страданий, потому что я не мог аннотировать универсальный тип поля.

Однако в режиме доступа к свойству я просто создаю свою общую абстрактную реализацию, не аннотируя ее как сущность, сопоставленный суперкласс, встраиваемый объект или что-либо еще. Таким образом, JPA будет игнорировать это. Затем в конкретных подклассах я по мере необходимости создаю защищенные методы получения и установки и помещаю в них аннотацию JPA.

Оказалось обманчиво простым.

...