jpa: как использовать jpa в разработке java se

Я работаю над проектом java se, который использует jpa для сохранения данных в базе данных.

Прямо сейчас я получаю новый менеджер сущностей для каждой операции с базой данных и закрываю его, когда заканчивается вызов функции. как

public void save(T entity){
  em = getNewEntity();
  em.persisty(entity);
  em.close;
}

но очень сложно управлять отношениями «многие ко многим». например
у меня есть объект A, у которого есть отношение "многие ко многим" с объектом B. и у них есть CascadeType.MERGE.

как только я создаю A, я создаю B и запускаю несколько потоков для генерации информации как для A, так и для B. но иногда B сохраняет устаревшие данные A, если я объединяю B, то данные A будут очищены.

Например . A — это музыка, B — музыкальный альбом, поэтому у одного B будет список A. Другой поток будет читать музыкальные метаданные и получать информацию о музыкальном теге и обновлять A , B будет обновляться, когда новый A будет найден в FS. обновите себя, Б не знает, А обновил. После слияния B jpa поможет нам объединить A, используя сущность в списке B A.

чтобы решить эту проблему, я решил использовать один менеджер сущностей и поместить все операции с базой данных в один поток. Потом вылезает новая проблема.

когда транзакция активна и транзакция должна быть открыта для объекта между

transaction.begin();
....
transaction.end();

однако существует много потоков, и эти потоки также могут изменить сущность.

мой вопрос: как использовать jpa в разработке java se? Благодарность


person Xiwen    schedule 10.06.2012    source источник
comment
Я бы сказал, что это не конкретная проблема JPA, а просто многопоточность. Вы должны правильно синхронизироваться везде, где вам нужно...   -  person home    schedule 10.06.2012
comment
синхронизация не может решить эту проблему... когда транзакция включена, я не могу заблокировать другой поток...   -  person Xiwen    schedule 10.06.2012
comment
Но вам нужно, если вы хотите синхронизировать определенную информацию. Я не совсем понимаю ваше приложение, но вам может понадобиться работать только с одним экземпляром EntityManager и использовать, например. java.util.concurrent.ReentrantReadWriteLock для управления уровнем доступа к данным...   -  person home    schedule 10.06.2012
comment
Это может помочь: stackoverflow.com/questions/5089411/   -  person home    schedule 10.06.2012
comment
Спасибо за ответ. Моя проблема заключается, например, в потоке службы БД с именем Thread A и других потоках, которые хранят сущности с именем Thread N. Поэтому я включаю транзакцию в Thread A, эта транзакция должна использоваться в Thread A. Однако диспетчер сущностей не Если объект не знает, к какому потоку он принадлежит, то объект в потоке N также может использовать эту транзакцию.   -  person Xiwen    schedule 10.06.2012


Ответы (1)


Если отношения выходят из строя, вы не можете винить JPA. Приложение несет ответственность за поддержание отношений в нормальном состоянии.

В JPA, как и в Java в целом, ответственность за поддержание взаимосвязей лежит на приложении или объектной модели.

Источник

Как сказал @home, вам нужно правильно синхронизироваться.

При этом EntityManager не является потокобезопасным, поэтому вам нужно каким-то образом решить эту проблему. Синхронизируйте свое приложение, используйте один EntityManager для каждого потока, используйте @PersistenceContext и т. д.

Изменить: Здесь задан вопрос о синхронизации доступа к EntityManager. Я думаю, что это может быть полезно для вас.

person siebz0r    schedule 10.06.2012