Я проходил несколько сообщений в Stackoverflow на JPA, и я читал несколько мест, в которых JPA не поддерживает интерфейсы. Может кто-то может поделиться тем, что это означает в реальном проекте. Означает ли это, что мы не можем аннотировать интерфейс?JPA не поддерживает интерфейсы.
ответ
Это означает, что вы не можете сопоставлять (аннотировать) или запрашивать на поверхности. Вы можете запрашивать только классы @Entity, и их можно разместить только на реальных классах, а не на интерфейсах. Обычно это не проблема, интерфейс не имеет состояния, поэтому это не то, что действительно актуально для сохранения на протяжении большей части времени. Вы все еще можете использовать интерфейсы в своей модели, вы просто не можете напрямую их сопоставлять.
Если у вас есть отношения, которые используют тип интерфейса, вам просто нужно установить targetEntity в класс реализации. Если у вас есть несколько исполнителей и не может заставить их делиться наследованием, тогда вам нужно стать более креативными. Некоторые поставщики JPA, такие как EclipseLink, поддерживают интерфейсы.
See, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Interfaces
Вам нужен прокси-генератор для интерфейса или реализации, которую вы предоставляете.
Можете ли вы опубликовать ссылки на ответы SO, о которых вы думаете, чтобы мы могли получить полный контекст? Это может помочь ответить на вопрос.
Вот один: http://stackoverflow.com/questions/4193676/jpa-relations-and-polymorphism. Можете ли вы рассказать о генераторе прокси или указать мне на какую-то статью в Интернете? –
В JPA, use @MappedSuperclass
for inheritance, аннотировать абстрактные классы, а не интерфейсы.
Я предпочитаю использовать общие базовые классы для всех моих объектов в данном проекте:
@MappedSuperclass
public abstract class BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
Теперь скажем, что некоторые из моих образований имеют дополнительное поведение в общем: автоматически обновляется временные метки для createdDate и updatedDate
@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
(если им нужны временные метки).
Вы также можете настроить the way the inheritance is modeled:
- Одна таблица на иерархии классов
- таблица на конкретный класс объекта (по умолчанию)
- «присоединиться к» стратегии А, причем поля или свойства, которые являются специфическими к подклассу сопоставляются с другой таблицей, чем поля или свойства, которые являются общими для родительского класса.
ОТВЕТСТВЕННОСТЬ: Я думаю, что выбор не для того, чтобы поддержка интерфейсов является хорошей. Интерфейсы предназначены для моделирования поведения, а не состояния. JPA - это управление состоянием, а не поведением, поэтому обе концепции не подходят друг другу.
И в тех случаях, когда вы думаете, что вам нужно множественное наследование, perhaps @Embeddable
is the solution
- 1. Интерфейсы отображения JPA
- 2. JPA аннотации и интерфейсы
- 3. Proguard поддерживает все интерфейсы java
- 4. несколько Уши, JPA и интерфейсы
- 5. Почему maven не поддерживает jpa 2.0?
- 6. В настоящее время поддерживает пользовательские интерфейсы Swagger?
- 7. Найти все импортированные интерфейсы, которые поддерживает объект
- 8. Поддерживает ли интерфейсы retrofit шаблонные обратные вызовы
- 9. Поддерживает ли JPA сопоставление с представлениями sql?
- 10. Поддерживает ли Spring Data REST JPA @Version?
- 11. Поддерживает ли JPA/Hibernate пользовательские типы
- 12. JPA EclipseLink поддерживает подзапрос в выборе? ClassCastException
- 13. Какие поддерживаемые версии JPA поддерживает EclipseLink 2.5
- 14. jpa inbound-channel-adapter не поддерживает источник параметров
- 15. Поддерживает ли SQLite .NET интерфейсы в методе CreateTable
- 16. JPA Связь между классами, ссылаясь на их интерфейсы
- 17. Поддерживает ли Parse bluetooth и другие периферийные интерфейсы?
- 18. Как Apache Spark поддерживает API-интерфейсы разных языков
- 19. не полностью реализованы интерфейсы
- 20. Интерфейсы: actionListener не работает
- 21. Интерфейсы: GraphicImage не обновляется
- 22. API интерфейсы не должны распространяться другие интерфейсы Модифицированные 2
- 23. Поддерживает ли Hibernate JPA модули mysql InnoDB и MyISAM
- 24. Поддерживает ли JPA 2.0 переменные таблицы SQL Server?
- 25. JPA/Hibernate поддерживает множество запросов в памяти при запуске приложения
- 26. Поддерживает ли JPA какое-либо «любое» отображение для встраиваемых объектов?
- 27. Поддерживает ли Jpa @Repository автоматическое обновление объекта при вызове сеттера?
- 28. Интерфейсы не передаются по ссылке
- 29. Интерфейсы Golang не нужно импортировать?
- 30. Получить интерфейсы, но не базовые
Итак, если у меня есть 1-много от Person to Address, и если может быть много разных типов адресов (например, CanadianAddress, UKAddress и т. Д.), Как мне сопоставить это ? –
Самый простой способ - определить класс AbstractAddress и использовать наследование JPA.В противном случае, если вы используете EclipseLink, вы можете сопоставить это с помощью сопоставления @VariableOneToOne. Вы могли бы также иметь у человека канадский адрес, ukAddress и т. Д. – James