JPA не поддерживает интерфейсы хорошо .. последствия? - PullRequest
6 голосов
/ 17 ноября 2010

Я просматривал некоторые сообщения в Stackoverflow на JPA и прочитал несколько мест, где JPA не поддерживает интерфейсы.Может кто-нибудь, пожалуйста, поделитесь, что это значит в реальном проекте.Значит ли это, что мы не можем комментировать интерфейс?

Ответы [ 3 ]

11 голосов
/ 17 ноября 2010

Это означает, что вы не можете отобразить (аннотировать) или сделать запрос на интерфейсе. Вы можете запрашивать только классы @Entity, и они могут быть размещены только в реальных классах, а не в интерфейсах. Обычно это не проблема, интерфейс не имеет состояния, поэтому это не то, что действительно имеет отношение к постоянству большую часть времени. Вы по-прежнему можете использовать интерфейсы в своей модели, но просто не можете отобразить их напрямую.

Если у вас есть отношение, которое использует тип интерфейса, вам просто нужно установить targetEntity для класса реализации. Если у вас есть несколько разработчиков и вы не можете заставить их делиться наследованием, вам нужно проявить больше творчества. Некоторые поставщики JPA, такие как EclipseLink, поддерживают интерфейсы.

См, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Interfaces

10 голосов
/ 17 ноября 2010

В JPA использовать @MappedSuperclass для наследования , аннотировать абстрактные классы, а не интерфейсы.

Я склонен использовать общие базовые классы для всех моих сущностей в данном проекте:

@MappedSuperclass
public abstract class BaseEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}

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

@MappedSuperclass
public abstract class ExtendedEntity extends BaseEntity{

    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date updatedDate;

    @PrePersist
    protected void creationTimeStamp(){
        createdDate = new Date();
        this.updateTimeStamp();
    }

    @PreUpdate
    protected void updateTimeStamp(){
        updatedDate = new Date();
    }

}

Теперь некоторые из моих сущностей расширяют BaseEntity напрямую, идругие расширяют ExtendedEntity (если им нужны временные метки).

Вы также можете настроить способ моделирования наследования :

  • Одна таблица для иерархии классов
  • Таблица для каждого конкретного класса сущности (по умолчанию)
  • Стратегия «соединения», при которой поля или свойства, относящиеся к подклассу, сопоставляются с таблицей, отличной от полей или свойств, которые являютсяобщий для родительского класса

Кстати: я думаю, что выбор не поддерживать интерфейсы - это хороший выбор.Интерфейсы предназначены для моделирования поведения, а не состояния.JPA - это управление состоянием, а не поведением, поэтому эти два понятия не сочетаются друг с другом.

И в тех случаях, когда вы считаете, что вам нужно множественное наследование, возможно @Embeddable - это решение

0 голосов
/ 17 ноября 2010

Вам нужен прокси-генератор для интерфейса или реализации, которую вы предоставляете.

Можете ли вы опубликовать ссылки на ответы SO, о которых вы думаете, чтобы мы могли получить полный контекст?Это может помочь ответить на вопрос.

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