2012-04-11 6 views
0

Есть ли возможность в JPA 2.0 утверждать, что встроенный объект встроен только с одним объектом, но не с несколькими?JPA 2.0: Встроенный объект, исключающий один объект

В моем случае у меня есть Address, который я могу присвоить Customer. Я хочу, чтобы каждый клиент использовал свой собственный адресный объект и хотел бы создать ограничение, которое гарантирует, что ни один из двух клиентов не будет делить фактически тот же объект.

Мой код выглядит следующим образом:

@Entity 
public Customer { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Embedded 
    private Address address; 

    // .. 
} 

@Embeddable 
public Address { 
    private String street; 
    private String city; 

    // .. 
} 

В настоящее время, если я создаю два клиента, и присвоить им один и тот же Address объект, а затем сохраняются и читать их, они снова разделяют объект с тем же лицом. Я хочу запретить сохранение таких клиентов, которые обмениваются адресами с другими клиентами.

+0

Если я понимаю вашу точку зрения, вы хотите создать уникальный адресная запись, даже если ее адрес совпадает с адресом? – Phani

+0

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

+1

Если вы не переопределили метод equals, он должен идеально хранить 2 записи в базе данных. Пожалуйста, проверьте sql, сгенерированный для действия, чтобы определить, что заставляет его хранить как 1. – Phani

ответ

1

Самый простой подход в этом случае - создать копию объекта Address в Customer.setAddress().

Кроме того, я не уверен, что разные Customer s могут делиться Address с тем же идентификатором при извлечении из базы данных. Возможно, вы получаете одни и те же объекты из кеша сеанса, потому что вы сохраняете и читаете их в одном сеансе.

1

Это характер механизма @Embedded, в котором внедренные экземпляры встраиваемого класса НИКОГДА не используются для разных экземпляров охватывающего класса. Если вы наблюдали это поведение в своем коде, это должно быть потому, что вы обращались к кешированным данным во время чтения из диспетчера сущностей. Таким образом, даже если вы назначаете один и тот же экземпляр вложенного класса нескольким экземплярам охватывающего класса, затем «persist()», затем уничтожайте диспетчер сущностей и EntityManagerFactories или аннулируйте кеши «entityManager.getEntityManagerFactory(). GetCache () .evictAll() ", затем создайте новый EntityManager и« find() »окружающие объекты, каждый из которых должен иметь свой собственный экземпляр объектов (в вашем случае)« Адрес », даже если их содержимое одинаковое.

JPA спецификация говорит следующее о внедренных объектов в разделе 2.5:

[...] Экземпляры этих классов, в отличие от экземпляров сущностей, не имеют постоянную идентификацию своих собственных. Вместо этого они существуют только как часть состояния объекта, к которому они принадлежат. [...]

Если ваша реализация JPA не прилипает к тому, что на самом деле не JPA соответствующей стандартам ...

Смежные вопросы