2014-11-14 3 views
0

У меня проблемы с спящим режимом, который звучит как связанный с кэшированием объектов.Спящий режим, восстанавливающий грязный объект

Устранение проблемы. У меня есть сущность, она называется A, с атрибутом списка, сопоставленным с @OneToMany(cascade=CascadeType.ALL, mappedBy="attribute"). Объекты в списке являются объектами класса B и имеют двунаправленную связь с A. Таким образом, B имеет атрибут, который указывает на A, сопоставленный с @OneToOne(cascade=CascadeType.MERGE). Я получаю объект A из базы данных и добавляю новый объект B в список A и звоню session.update(A).

Проблема возникает, когда я получаю все объекты A, вызывающие session.createCriteria(A.class).list();, доступ к объекту A, который я обновил, и объект B, который я добавил, нет в списке.

Я попытался позвонить session.refresh(A) после обновления A, но проблема все еще сохраняется.

Знает ли кто-нибудь, как с этим бороться.

ответ

0

У вас есть @OneToMany (cascade = CascadeType.ALL, mappedBy = "attribute") для класса A для отображения элементов B, а на B у вас есть элемент @OneToOne (cascade = CascadeType.MERGE) => он не является когерентным ,

Вы должны @ManyToOne на класс В.

Вы можете увидеть пример здесь: http://fruzenshtein.com/bidirectional-many-to-one-association/

И если вы хотите добавить новый объект B, вы должны иметь дело с идентификатором из-за двунаправленная связь.

"Я получаю объект A из базы данных и добавляю новый объект B" => B имеет ссылку на A? Если не двунаправленная ссылка не соблюдается.

EDIT: вы можете увидеть некоторые объяснения здесь http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

«Поскольку отношения является двунаправленным, так как обновления приложения одна сторона отношений, другая сторона должна также получить обновленные и быть синхронизированы в. JPA, как и в Java, как правило, это приложение или модель объекта для поддержания отношений. Если ваше приложение добавляет к одной стороне отношения, то оно должно добавляться к другой стороне ».

+0

Вы правы. Я заменил OneToOne на OneToMany, но проблема все еще сохраняется. –

+0

Я пришел к ответу – rlm

+0

Спасибо за ответы, но проблема по-прежнему сохраняется. –

0

Поскольку у вас есть двунаправленная связь между объектами A и B, вам также необходимо поддерживать отношения в вашем Java-коде.

на основе кода, позволяет сказать:

A.java:

@OneToMany(cascade=CascadeType.ALL, mappedBy="attribute") 
List<B> bObjs; 

B.java:

@ManyToOne(cascade=CascadeType.MERGE) 
@JoinColumn 
A attribute; 

Тогда для поддержания отношений в Java кода, который необходимо установить с обеих сторон, как это:

a.setBObjs(listOfBs); 
b.setA(a); 

Тогда вы можете позвонить по номеру session.update(a), таким образом, спящий режим сможет сохранить объекты правильно.

+0

Имеется ли аннотационный аннотаж JoinColumn? Если нет, я сделал это, как вы показали в своем ответе. –

+0

Если вы удалите JoinColumn, тогда hibernate создает таблицу Join по умолчанию, поэтому это необязательно. Можете ли вы показать точный код, который вы попробовали, а также отправить свои сущности на вопрос? – Chaitanya

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