Как определить полиморфизм в JPA - PullRequest
5 голосов
/ 28 октября 2010

есть ситуация. Например, я проектирую простой блог. Есть статьи и фотографии. Пользователи могут добавлять свои комментарии к ним обоим. Поэтому, когда я пишу это на Java, это выглядит так:

public interface Commentable { ... }

public class Article implements Commentable { ... }

public class Photo implements Commentable { ... }

public class Comment { 
   ...
   private Commentable commentTo; 
}

Это понятно, и я надеюсь, что дизайн правильный. Но сейчас я хотел бы сохранить его в базе данных и использовать аннотации JPA. Прежде всего я должен использовать JPA 1.0, но если нет решения, я хотел бы знать, как это сделать в JPA 2.0. Я обнаружил, что есть способ с классическим наследованием, но я думаю, что Commentable не должен быть родителем этого объекта, это всего лишь расширение в свете дизайна.

Есть ли способ, как сохранить это без изменения дизайна, пожалуйста? Большое спасибо

1 Ответ

8 голосов
/ 28 октября 2010

Есть ли способ сохранить его без изменения дизайна, пожалуйста?Большое спасибо

JPA на самом деле не поддерживает ваш дизайн (если быть точным, вы можете отобразить отношение, указывающее на интерфейс, если есть одна реализация, но это не ваш случай).Ваш провайдер JPA может иметь некоторую поддержку для этого (например, EclipseLink имеет аннотацию @VariableOneToOne).

В стандартном JPA обычным подходом будет использование абстрактного класса (с вашим интерфейсом или без него) и использование наследования.Например (при сохранении интерфейса):

public class Comment { 
   ...
   @OneToOne(targetEntity=MyAbstractBaseClass.class)
   private Commentable commentTo; 
}

Где Article и Photo будут расширять MyAbstractBaseClass и расширять интерфейс.

В википедии по JPA есть два хороших раздела:эту тему см. ниже.

Ресурсы

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