Jpa entitymanager управляємо сутностями, easyjava

refresh () перечитує динячі керованої суті з бази, залишаючи її при цьому керованої. Ця операція виконується так само і для пов'язаних сутностей, у яких виставлено каскадирование CascadeType. REFRESH або CascadeType. ALL.

Які ще можуть бути стану? В першу чергу "віддалена" (deleted) сутність. Видаляються сутність методом remove (). який переводить її в стан "віддалена" і запам'ятовує, що записи в базі даних треба б видалити. Ця операція виконується так само і для пов'язаних сутностей, у яких виставлено каскадирование CascadeType. REMOVE або CascadeType. ALL.

Віддалену сутність можна відновити викликом persist (). яка знову поверне сутність в керовані і прибере позначки про видалення з бази.

Нарешті найцікавіше стан - "відокремлена" (detached). Зазвичай сутність впадає в цей стан раптово і втрачає зв'язок з керуючим їй EntityManager. Перехід в цей стан може статися при:

  • Серіалізациі / десеріалізациі суті, передачі з jvm в jvm і т.д.
  • закінчення транзакції
  • Закритті EntityManager методом close () або просто збирачем сміття.
  • Скидання persistence context EntityManager методом clear ().

Відокремлена сутність втрачає зв'язок з базою даних і зміни в ній в базу самі не потрапляють. І що найгірше, ліниво завантажуються поля теж не завантажуються. І видалити її не можна і з бази її теж не оновити.

Вихід з цієї ситуації тільки один - метод merge () у EntityManager. merge (). застосований на від'єднаний суті, або копіює значення переданої суті в уже існуючу сутність з тим самим значенням поля @id. або створює нову сутність цього типу і копіює дані в неї. В обох випадках результат зберігається в базу і з методу повертається нова керована сутність. Стара при цьому залишається від'єднаний.

merge () можна використовувати і з новими сутностями. На відміну від persist () він створить ще одну сутність того ж типу, скопіює всі дані в неї і зробить її керованою. persist () ж, як написано вище, копій не робить і переводить в керовані то, що йому передали.

Останнє стан, в якому може перебувати сутність, це "збережена" (persisted). У цьому стані сутність існує тільки в базі даних, а в програмі її немає. Перекласти сутність в стан керованої, тобто просто завантажити її з бази даних, можна методами EntityManager find () або сімейством методів createQuery (). Ці методи дозволяють будувати досить складні запити для будь-якої потреби, але зараз я розповім тільки про базову використанні: завантаження суті по її ідентифікатором і завантаження всіх сутностей певного типу.