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.
Тъй като мениджърът на обекти е затворен, обектите в списъка A на B са остарели, което означава, че когато A актуализира се, B не знае, че A се актуализира. Веднъж Merge B, jpa ще ни помогне да обединим A, като използваме обекта в списъка A на B.

за да разреша този проблем, решавам да използвам един мениджър на обекти и да поставя всички операции с базата данни в една нишка. Тогава излиза нов проблем.

когато транзакцията е активна и транзакцията трябва да се отвори за обекта между

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

обаче има много работещи нишки и тези нишки също могат да променят обект.

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


person Xiwen    schedule 10.06.2012    source източник
comment
Бих казал, че това не е конкретен проблем с JPA, а просто многопоточност. Трябва да синхронизирате правилно навсякъде, където трябва...   -  person home    schedule 10.06.2012
comment
synchronize не може да реши това ... когато транзакцията е включена, не мога да блокирам друга нишка...   -  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
Благодаря за отговора. моят проблем е, например, нишката на услугата на DB, наречена Thread A, и други нишки, които поддържат обекти, наречени Thread N. Така че аз включвам транзакция в Thread A, тази транзакция трябва да се използва в Thread A. Въпреки това, мениджърът на обекти не t знае, че обектът принадлежи към коя нишка, тогава обектът в Нишка N може също да използва тази транзакция.   -  person Xiwen    schedule 10.06.2012


Отговори (1)


Ако връзката излезе от синхрон, не можете да обвинявате JPA. Отговорност на приложението е да поддържа връзката нормална.

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

Източник

Както каза @home, трябва да синхронизирате правилно.

Като се има предвид това, EntityManager не е безопасен за нишки, така че трябва да разрешите това по някакъв начин. Синхронизирайте вашето приложение, използвайте един EntityManager на нишка, използвайте @PersistenceContext и т.н.

Редактиране: Тук е зададен въпрос относно синхронизирането на достъпа до EntityManager. Мисля, че може да ви е от полза.

person siebz0r    schedule 10.06.2012