{"id":340220,"date":"2022-10-25T15:00:38","date_gmt":"2022-10-25T15:00:38","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=340220"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=340220","title":{"rendered":"<span>Spring Data JPA: \u043c\u0435\u0442\u043e\u0434 save \u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/kirekov\/posts\/\">\u0421\u0435\u043c\u0451\u043d \u041a\u0438\u0440\u0435\u043a\u043e\u0432<\/a>, \u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u0442\u0438\u043c\u043b\u0438\u0434 \u0432 \u0426\u0435\u043d\u0442\u0440\u0435 Big Data @<a href=\"https:\/\/habr.com\/ru\/company\/ru_mts\/blog\/\"><u>\u041c\u0422\u0421 Digital<\/u><\/a> \u0438 Java-\u0434\u0435\u043a\u0430\u043d \u0432 <a href=\"https:\/\/www.teta.mts.ru\/\"><u>\u041c\u0422\u0421 \u0422\u0435\u0442\u0430<\/u><\/a> \u2014\u00a0\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u041c\u0422\u0421. \u041d\u0430 <a href=\"https:\/\/habr.com\/ru\/company\/rosbank\/news\/t\/685722\/\"><u>\u043c\u0438\u0442\u0430\u043f\u0435 \u0420\u043e\u0441\u0431\u0430\u043d\u043a\u0430 \u0438 Jug.ru<\/u><\/a> \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043c\u0435\u0442\u043e\u0434 Save \u0432 Spring Data JPA, \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0439 select, \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u043f\u0440\u0438 \u0447\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f Spring. \u0417\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0441 \u0432\u0430\u043c\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/0b8\/531\/f57\/0b8531f57eeb3aab4abc807a54ee660b.jpeg\" width=\"1920\" height=\"1083\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b8\/531\/f57\/0b8531f57eeb3aab4abc807a54ee660b.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c Post. \u0423 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c id, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0439, \u0438 \u0442\u0430\u0439\u0442\u043b:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Setter @Getter public class Post {   @Id   @GeneratedValue(strategy = IDENTITY)   private Long id;   private String title; }<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c PostService, \u043c\u044b \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u043c \u0432 \u043d\u0435\u0433\u043e PostRepository, \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Spring Data JPA \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u0418 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 changeTitle, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Post. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 Transactional; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434 \u2014\u00a0\u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f. \u0412 \u043d\u0435\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c id, \u043d\u043e\u0432\u044b\u0439 \u0442\u0430\u0439\u0442\u043b \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 save.\u00a0<\/p>\n<pre><code class=\"java\">@Service public class PostService {   private final PostRepository postRepository;    @Transactional   public void changeTitle(Long postId, String title) {     final var post = postRepository.findById(postId).orElseThrow();     post.setTitle(title);     postRepository.save(post);   } } <\/code><\/pre>\n<p>\u0423\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0432 \u0442\u043e\u043c \u0438\u043b\u0438 \u0438\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438 \u0442\u0430\u043a\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 HQL. \u041d\u0430\u0448\u043b\u0438 \u043f\u043e\u0441\u0442, \u043f\u0440\u043e\u0430\u043f\u0434\u0435\u0439\u0442\u0438\u043b\u0438 \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b?<\/p>\n<p><code>Hibernate: select post0_.id as id1_0_0_, post0_.description as descript2_0_0_, post0_.title as title3_0_0_ from post post0_ where post0_.id=? Hibernate: update post set description=?, title=? where id=?<\/code><\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043c\u0435\u0442\u043e\u0434 save. EntityInformation.isNew \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0447\u0442\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c persist, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014\u00a0merge:<\/p>\n<pre><code class=\"java\">@Transactional @Override public &lt;S extends T> S save(S entity) {    Assert.notNull(entity, \"Entity must not be null.\");    if (entityInformation.isNew(entity)) {     em.persist(entity);     return entity;   } else {   return em.merge(entity);   } }<\/code><\/pre>\n<h3>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b entity \u0432 JPA<\/h3>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 JPA:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8fd\/2e0\/905\/8fd2e09059c56da69b5bf564f01f2b5e.png\" width=\"1600\" height=\"1193\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8fd\/2e0\/905\/8fd2e09059c56da69b5bf564f01f2b5e.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043e\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Transient \u2014\u00a0\u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Hibernate. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Managed \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f Hibernate \u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 HQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b (update, insert, delete \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435). \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Managed \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0435 \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043b\u0438\u0431\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u043f\u043e id (find getReference). \u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 flush \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432\u044b \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Removed: \u0435\u0441\u043b\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u043d\u0435\u0433\u043e, \u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d delete. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 delete \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 remove, \u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0447\u0435\u0440\u0435\u0437 persist.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e Detached. \u0415\u0441\u043b\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u0443 \u0432\u0430\u0441 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Managed, \u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u043b\u0430\u0441\u044c, \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Detached. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c id, \u043e\u043d\u0430 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043b\u0430\u0441\u044c, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e persistent-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0432\u044b \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0441 Post \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u0442\u043e\u0434. \u0422\u0430\u043c \u0443\u0436\u0435 \u044d\u0442\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 Detached. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 detach (\u043e\u043d \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c). \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0442\u043e \u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 merge. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0435 Post \u0438 \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043b\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438?<\/p>\n<ul>\n<li>\n<p>Dirty Checking, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 save.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f merge \u0434\u043b\u044f PERSISTED \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 save \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f merge.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0441 @Transactional \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c save \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f, \u0430\u043f\u0434\u0435\u0439\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"java\">final var post = postRepository.findById(postId).orElseThrow();   post.setTitle(title); }<\/code><\/pre>\n<h3>\u041c\u0435\u0442\u043e\u0434 copyValues<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 Hibernate:<\/p>\n<pre><code class=\"java\">protected void entityIsPersistent(MergeEvent event, Map copyCache) {   LOG.trace( \"Ignoring persistent instance\" );    \/\/TODO: check that entry.getIdentifier().equals(requestedId)    final Object entity = event.getEntity();   final EventSource source = event.getSession();   final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );     ( (MergeContext) copyCache ).put( entity, entity, true ); \/\/before cascade! cascadeOnMerge( source, persister, entity, copyCache );   copyValues( persister, entity, entity, source, copyCache );    event.setResult( entity ); }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 copyValues. Hibernate \u0434\u043e\u0441\u0442\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (entity), \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432 \u0441\u0432\u043e\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e Entity. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u044f\u043d\u0443\u0442\u044c\u0441\u044f. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442 \u0446\u0438\u043a\u043b\u044b \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 merge \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0434\u043b\u044f MANAGED entity? \u0415\u0441\u043b\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 entity \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d copyValues \u0438 \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0438\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432 entity \u043c\u043d\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432.<\/p>\n<p>\u042f \u0437\u0430\u0434\u0430\u043b\u0441\u044f <a href=\"https:\/\/stackoverflow.com\/questions\/73471541\/hibernate-why-copyvalues-is-called-during-merge-event-for-persistent-entities\"><u>\u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c<\/u><\/a>: \u0430 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u0435\u043d copyValues? \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u044f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u044d\u0442\u043e, \u0432\u0438\u0434\u0438\u043c\u043e, \u043a\u043e\u0441\u0442\u044b\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0441\u0442\u0430\u043b \u0444\u0438\u0447\u0435\u0439. \u0421\u0443\u0442\u044c \u0432\u043e\u0442 \u0432 \u0447\u0435\u043c: \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0435 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e, \u0442\u043e \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f one to many \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0415\u0441\u043b\u0438 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Detached, \u0442\u043e \u0432\u044b\u0437\u043e\u0432 copyValues \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0438\u0445 \u043d\u0430 \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 entity \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Managed. \u0422\u0430\u043a Hibernate \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0437\u0430\u0447\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u043d\u043e, \u0432\u0438\u0434\u0438\u043c\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0438 \u0442\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u0436\u0435 Post, \u043d\u043e \u0441 id \u0432 \u0432\u0438\u0434\u0435 UUID. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0430\u0437\u043e\u0439:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Getter @Setter public class Post {   @Id   private UUID id;    private String title;    public static Post newPost() {     final var post = new Post();     post.setId(UUID.randomUUID());     return post;   } }<\/code><\/pre>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0441\u0442, \u0430 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e. \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0441\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Transient, \u0442\u043e \u0435\u0441\u0442\u044c Hibernate \u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442. \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c save. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043b\u043e\u0433\u0430\u0445:<\/p>\n<p><code>Hibernate: select post0_.id as id1_1_0_,<br \/> post0_.description as descript2_1_0_,<br \/> post0_.title as title3_1_0_<br \/> from post post0_ where post0_.id=?<br \/>Hibernate: insert into post (description, title, id) values (?, ?, ?)<\/code><\/p>\n<p>Select \u0431\u0443\u0434\u0435\u0442 \u0443 \u043d\u0430\u0441 \u043f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 id, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 insert. \u0422\u043e \u0435\u0441\u0442\u044c Hibernate \u0434\u0435\u043b\u0430\u0435\u0442 select, \u0430 \u043f\u043e\u0442\u043e\u043c insert. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c breakpoint, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u0441\u044f merge, \u0430 \u043d\u0435 persist:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca6\/b58\/059\/ca6b580597a9c49578263992b0cc1f39.png\" width=\"1600\" height=\"631\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ca6\/b58\/059\/ca6b580597a9c49578263992b0cc1f39.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 isNew<\/h3>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 EntityInformation.isNew. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 Spring Data \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 entity \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f version. \u0415\u0441\u043b\u0438 \u0435\u0435 \u043d\u0435\u0442 \u043b\u0438\u0431\u043e \u0442\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432, \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443. \u0415\u0441\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 version \u0435\u0441\u0442\u044c, \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u043d null. \u0415\u0441\u043b\u0438 \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u043d\u043e\u0432\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e, \u0430 \u043d\u0435 \u0432\u0437\u044f\u0442\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u044b. \u0423 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 version, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 Spring Data JPA \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 id \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u043c.<\/p>\n<pre><code class=\"java\">public boolean isNew(T entity) {  ID id = getId(entity); Class&lt;ID> idType = getIdType();      if (!idType.isPrimitive()) {   return id == null; }  if (id instanceof Number) {   return ((Number) id).longValue() == 0L; }  throw new IllegalArgumentException(   String.format(\"Unsupported primitive id type %s\", idType) ); }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e null, \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0438 \u0447\u0438\u0441\u043b\u043e \u2014 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u043d\u043e \u043d\u0443\u043b\u044e. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u044b char \u0438 boolean, \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u0440\u043e\u043b\u044c \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430.<\/p>\n<p>\u041e\u0431\u043e\u0431\u0449\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b isNew \u0432 Spring Data JPA:<\/p>\n<ol>\n<li>\n<p>New, \u0435\u0441\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 @Version \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0440\u0430\u0432\u0435\u043d null.<\/p>\n<\/li>\n<li>\n<p>New, \u0435\u0441\u043b\u0438 ID \u0440\u0430\u0432\u0435\u043d null.<\/p>\n<\/li>\n<li>\n<p>New, \u0435\u0441\u043b\u0438 ID \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0438 \u0440\u0430\u0432\u0435\u043d 0.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0430\u0447\u0435 \u2014 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f new.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u0438 \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 merge. \u0412\u043e\u0442 \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"java\">final PersistenceContext persistenceContext = source.getPersistenceContextInternal(); EntityEntry entry = persistenceContext.getEntry( entity ); if ( entry == null ) {   EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );   Serializable id = persister.getIdentifier( entity, source );   if ( id != null ) {     final EntityKey key = source.generateEntityKey( id, persister );     final Object managedEntity = persistenceContext.getEntity( key );     entry = persistenceContext.getEntry( managedEntity );     if ( entry != null ) {        entityState = EntityState.DETACHED;     }   } }  if ( entityState == null ) {   entityState = EntityState.getEntityState( entity, event.getEntityName(), entry, source, false ); }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Hibernate. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043e\u043d \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u044d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435. Hibernate \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0430\u043f\u0434\u0435\u0439\u0442\u0438\u0442\u044c, \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0437\u0430\u0438\u043d\u0441\u0435\u0440\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0451.<\/p>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u0434\u0443. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 Hibernate \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432 PersistenceContext. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438, \u0442\u043e \u0442\u0430\u043c \u043f\u0443\u0441\u0442\u043e \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438, \u043e\u043d \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u043e id. \u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0441\u0442, \u0442\u0430\u043c \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u2014\u00a0\u0432\u044b\u0437\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 get EntityState.<\/p>\n<pre><code class=\"java\">final Serializable clonedIdentifier =   (Serializable) persister.getIdentifierType().deepCopy( id, source.getFactory() ); final Object result = source.get( entityName, clonedIdentifier ); source.getLoadQueryInfluencers().setInternalFetchProfile( previousFetchProfile ); if ( result == null ) {   entityIsTransient( event, copyCache ); }<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0412 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0441 source.get \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 select. Hibernate \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u043d\u0443\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0432 \u0431\u0430\u0437\u0435. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 Transient.<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043b\u0438\u0448\u043d\u0438\u0445 select<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 select \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u0430 \u0447\u0442\u0435\u043d\u0438\u0439. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e select + insert \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430.<\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u2014\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c UUID Generator:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post_uuid\") @Getter @Setter public class PostWithUUID {   @Id   @GeneratedValue(generator = \"UUID\")   @GenericGenerator(     name = \"UUID\",     strategy = \"org.hibernate.id.UUIDGenerator\"   )   private UUID id;    private String title;     public static PostWithUUID newPost() {     return new PostWithUUID();   } }<\/code><\/pre>\n<p>Spring Data \u0443\u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e id = null, \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043d\u043e\u0432\u0430\u044f, \u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 persist-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043e\u0440. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0441 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430\u043c\u0438.<\/p>\n<ul>\n<li>\n<p>\u041c\u044b \u0442\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e ID \u0434\u043b\u044f equals\/hashCode. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439 \u043e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/thorben-janssen.com\/ultimate-guide-to-implementing-equals-and-hashcode-with-hibernate\/\"><u>Ultimate Guide to Implementing equals() and hashCode() with Hibernate<\/u><\/a>.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c EmbeddedUUID.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u043d\u043a\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Getter @Setter public class Post {   @EmbeddedId   private PostID id;   private String title;    public static Post newPost() {     final var post = new Post ();     post.setId(new PostID(UUID.randomUUID()));     return post;   }     @Embeddable   @EqualsAndHashcode   @Getter @AllArgsConstructor @NoArgsConstructor   public static class PostID implements Serializable {       @Column(name = \"id\")     private UUID value;   }<\/code><\/pre>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c Post, \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 PostID \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e EmbeddedID. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">public interface PostRepo extends JpaRepository&lt;Post, PostID> {  }<\/code><\/pre>\n<p>\u0412 HQL-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c id, \u0430 PostID, \u0438\u043c\u0435\u044e\u0449\u0438\u043c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043c\u044b\u0441\u043b. \u0415\u0441\u043b\u0438 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u044b \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 id, \u0442\u043e \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c generator \u2014\u00a0Hibernate \u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043c\u0435\u0442. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Persistable. \u041e\u043d \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 JPA, \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e Spring Data. \u041f\u043e \u0441\u0443\u0442\u0438, \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 isNew:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Getter @Setter public class Post implements Persistable&lt;Post.PostID> {   @Transient   private transient boolean isNew;   @EmbeddedId   private PostID id;   private String title;    public static Post newPost() {     final var post = new Post ();     post.setId(new PostID(UUID.randomUUID()));     post.setNew(true);     return post;   }    @Override   public boolean isNew() {     return isNew;   }    @Embeddable   @Getter @EqualsAndHashCode @AllArgsConstructor @NoArgsConstructor   public static class PostID implements Serializable {     @Column(name = \"id\")     private UUID value;   }   @PostLoad   @PrePersist   void trackNotNew() {     this.isNew = false;   } }<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 Persistable, \u0442\u043e \u043b\u043e\u0433\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435, \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e Spring Data JPA \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 entity, \u043d\u043e\u0432\u0430\u044f \u043e\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0434\u0430 \u2014\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f persist; \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 merge. \u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435 \u043d\u0430 \u0441\u0435\u0431\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0442\u043e\u0433\u043e, \u043d\u043e\u0432\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 isNew \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 @Transient, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0430. \u041f\u043e\u043b\u0435 isNew \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a true, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0441\u0442. \u0418 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c false \u0432 \u043a\u043e\u043d\u0446\u0435, \u0438\u043d\u0430\u0447\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<p>\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0437\u044f\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434 save, \u0435\u0441\u043b\u0438 \u043e\u043d \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0439 \u0438 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 JPA?<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e6\/4c5\/0a0\/6e64c50a0adfb52de1c640848dfeafee.png\" width=\"1600\" height=\"790\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6e6\/4c5\/0a0\/6e64c50a0adfb52de1c640848dfeafee.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0441\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 Spring Data, \u0432\u043a\u043b\u044e\u0447\u0430\u044f JPA, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u043e\u0442 CrudRepository, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 save. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b. JPA \u0437\u0434\u0435\u0441\u044c, \u0441\u043a\u043e\u0440\u0435\u0435, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0438 \u0432 JPA \u0443 save \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b. \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0435 \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f insert.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043d\u0435\u043a\u0438\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0435\u0441\u0442\u044c \u043b\u0438 \u043e\u043d \u0432 \u0431\u0430\u0437\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u2014\u00a0\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u0432\u0440\u043e\u0434\u0435<\/p>\n<pre><code class=\"java\">If (select == null)   insert else   update<\/code><\/pre>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438, \u043c\u0435\u0442\u043e\u0434 save \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e \u0432 \u0441\u0435\u0431\u0435.<\/p>\n<h3>Hibernate Repository \u043f\u0440\u043e\u0442\u0438\u0432 \u043b\u0438\u0448\u043d\u0438\u0445 select<\/h3>\n<p>\u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 save \u043d\u0430\u043c \u043c\u0435\u0448\u0430\u0435\u0442? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u043b\u0438\u0448\u043d\u0438\u0445 select \u0438 copyValues, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f. \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u2014 Hibernate Repository. \u041e\u043d \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/vladmihalcea.com\/best-spring-data-jparepository\/\"><u>The best Spring Data JpaRepository<\/u><\/a>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0435\u0441\u0442\u044c \u0432 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/github.com\/vladmihalcea\/hibernate-types\"><u>Implementation: Hibernate Types<\/u><\/a>.<\/p>\n<p>public interface HibernateRepository&lt;T> {<\/p>\n<pre><code class=\"java\">public interface HibernateRepository&lt;T> {   &lt;S extends T> S persist(S entity);   &lt;S extends T> S merge(S entity); }<\/code><\/pre>\n<p>\u041c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u0438\u0437 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u2014 persist \u0438 merge. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b EntityManager:<\/p>\n<pre><code class=\"java\">@Repository class HibernateRepositoryImpl&lt;T> implements HibernateRepository&lt;T> {   @PersistenceContext   private EntityManager em;    @Override   public &lt;S extends T> S persist(S entity) {     em.persist(entity);     return entity;   }    @Override   public &lt;S extends T> S merge(S entity) {     return em.merge(entity);   } }<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u043d\u0430\u0448 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Post \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Hibernate:<\/p>\n<pre><code class=\"java\">public interface PostRepository   extends JpaRepository&lt;Post, Long>, HibernateRepository&lt;Post> { }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044f\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c persist \u0438 merge. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u0432, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c. \u0421\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0430\u0440\u0445\u0438\u0432, \u0433\u0434\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u043e\u043b\u043b\u0431\u044d\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u2014 \u0435\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430. \u0410 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 Kafka.<\/p>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2014 \u043f\u0430\u0442\u0442\u0435\u0440\u043d domain-driven \u0434\u0438\u0437\u0430\u0439\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 Spring \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430\u0442\u0438\u0432\u043d\u043e.<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Setter @Getter public class Post extends AbstractAggregateRoot&lt;Post> {   @Id   @GeneratedValue(strategy = IDENTITY)   private Long id;    private String title;    public void changeTitle(String title) {     this.title = title;     registerEvent(new PostNameChanged(id));   } }<\/code><\/pre>\n<p>\u041e\u0442 \u043d\u0430\u0448\u0435\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 AbstractAggregateRoot. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 registerEvent.<\/p>\n<pre><code class=\"java\">public class AbstractAggregateRoot&lt;A extends AbstractAggregateRoot&lt;A>> {   private transient final @Transient List&lt;Object> domainEvents = new ArrayList&lt;>();    protected &lt;T> T registerEvent(T event) {     Assert.notNull(event, \"Domain event must not be null\");     this.domainEvents.add(event);     return event;   }    @AfterDomainEventPublication   protected void clearDomainEvents() {     this.domainEvents.clear();   }    @DomainEvents     protected Collection&lt;Object> domainEvents() {     return Collections.unmodifiableList(domainEvents);   } }<\/code><\/pre>\n<p>AggregateRoot \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a. \u041c\u0435\u0442\u043e\u0434 domainEvents \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Spring \u0438 \u0432\u044b\u0434\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438. AfterDomainEventPublication, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0447\u0438\u0449\u0430\u0435\u0442.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TransactionalEventListener. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 EventListener, \u0441 \u0442\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439, \u0447\u0442\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e:<\/p>\n<pre><code class=\"java\">@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) public void archiveChanges(PostNameChanged postNameChanged) {   \u2026 } @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void sendMessageToKafka(PostNameChanged postNameChanged) {   \u2026 }<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c, \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0432\u0441\u0435 \u0435\u0449\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u0430. \u0415\u0441\u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0432\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b persist, merge, \u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044f\u0442\u0441\u044f:<\/p>\n<pre><code class=\"java\">@Transactional public void changeTitle(Long postId, String title) {   final var post = postRepository.findById(postId).orElseThrow();   post.changeTitle(title); }<\/code><\/pre>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, save, \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044f\u0442\u0441\u044f \u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u044b.<\/p>\n<pre><code class=\"java\">@Transactional public void changeTitle(Long postId, String title) {   final var post = postRepository.findById(postId).orElseThrow();   post.changeTitle(title);   postRepository.save(post); }<\/code><\/pre>\n<h4>\u041a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c Hibernate \u0438 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/h4>\n<p>\u042f \u0437\u043d\u0430\u044e \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0430, \u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0434\u0432\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445. \u041f\u0435\u0440\u0432\u044b\u0439 \u2014\u00a0\u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 ApplicationEventPublisher \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Setter @Getter public class Post {   @Id   @GeneratedValue(strategy = IDENTITY)   private Long id;    private String title;    public void changeTitle(String title,     ApplicationEventPublisher eventPublisher) {     this.title = title;     eventPublisher.publishEvent(new PostNameChanged(id));   } }<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u2014 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b \u043d\u0430 entity. \u0422\u0430\u043a \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u0442\u0435 rich domain model \u043f\u043e \u043a\u0430\u043d\u043e\u043d\u0430\u043c domain driven \u0434\u0438\u0437\u0430\u0439\u043d\u0430. \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a entity, \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c ApplicationEventPublisher.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 DomainEventPublisher:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Setter @Getter public class Post {   @Id   @GeneratedValue(strategy = IDENTITY)   public Long id;   private String title;   public void changeTitle(String title) {   this.title = title;   DomainEventPublisher.publish(new PostNameChanged(id));   } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Spring Bean. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 setEventPublisher \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c ApplicationEventPublisher \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u0443 \u043d\u0430\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 publishEvent:<\/p>\n<pre><code class=\"java\">@Component public class DomainEventPublisher {   private static volatile ApplicationEventPublisher publisher;     @Autowired   private void setEventPublisher(ApplicationEventPublisher eventPublisher) {     publisher = eventPublisher;   }    public static void publish(Object event) {     Assert.notNull(publisher, \"ApplicationEventPublisher is null. Check the configuration\");   publisher.publishEvent(event);   } }<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u2014\u00a0\u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044f\u0432\u043d\u043e \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c ApplicationEventPublisher, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u043c\u044b \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f Inversion of Control: \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Spring, \u043d\u043e \u0442\u0443\u0442 \u0436\u0435 \u043e\u0442 \u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f. \u0422\u0430\u043a\u0436\u0435 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c entity \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 Spring, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e entity \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 DomainEventPublisher, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0432\u044f\u0437\u0430\u043d \u0441\u043e Spring.<\/p>\n<p>\u041e\u0446\u0435\u043d\u0438\u043c \u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043d\u0436\u0435\u043a\u0442 bean \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 entity, \u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430. \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043d\u0435\u0440\u0443\u0448\u0438\u043c\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f, \u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0437\u0430 \u043d\u0435\u0433\u043e.<\/p>\n<ul>\n<li>\n<p>\u0412 \u0441\u0432\u044f\u0437\u043a\u0435 Spring + Hibernate \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u0435 Spring.<\/p>\n<\/li>\n<li>\n<p>ApplicationEventPublisher \u2014\u00a0\u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0433\u0434\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0441\u0442\u044c. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u0430\u043c \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 Spring, \u0438 \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043a \u043d\u0435\u0439 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0435\u0441\u044c.<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0431\u044b\u043b \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 <a href=\"https:\/\/www.oreilly.com\/library\/view\/implementing-domain-driven-design\/9780133039900\/\"><u>Implementing Domain-Driven Design<\/u><\/a>. \u0414\u0430, \u044d\u0442\u043e \u0430\u043f\u0435\u043b\u043b\u044f\u0446\u0438\u044f \u043a \u0430\u0432\u0442\u043e\u0440\u0438\u0442\u0435\u0442\u0443, \u043d\u043e \u0438\u0437 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u044d\u0442\u043e\u0442 \u0442\u043e\u0436\u0435 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c?<\/h3>\n<p>\u041a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430. \u0421\u0442\u043e\u0438\u0442, \u0435\u0441\u043b\u0438 \u0432\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0438 \u0432\u044b\u0437\u043e\u0432 save \u043c\u043e\u0436\u0435\u0442 \u0441\u044b\u0433\u0440\u0430\u0442\u044c \u0437\u043b\u0443\u044e \u0448\u0443\u0442\u043a\u0443 \u0438\u0437-\u0437\u0430 copyValues. \u0418\u043b\u0438 \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043d\u0430\u0434 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c insert per second, \u0438 \u0432\u0430\u043c \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 save \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b insert \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<ul>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 save \u0432 Spring Data JPA \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043a\u0430\u0437 \u043e\u0442 \u043d\u0435\u0433\u043e \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u044f\u0432\u043d\u043e\u0433\u043e persist\/merge \u0434\u0430\u0441\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 low API.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 \u043e\u0442 save, \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0441 \u0443\u043c\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0439\u0442\u0435\u0441\u044c \u0441\u043b\u0435\u043f\u043e \u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0438\u0437\u0443\u0447\u0430\u0439\u0442\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u0412 99% \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 save \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u0435\u0439\u0441\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>Spring Data \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438 save \u0432 \u043d\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e \u0440\u044f\u0434 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u0432 \u043b\u043e\u0433\u0430\u0445 \u0432\u0434\u0440\u0443\u0433 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043b\u0438\u0448\u043d\u0438\u0435 select \u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0437\u043d\u0430\u0442\u044c, \u043a\u0443\u0434\u0430 \u043a\u043e\u043f\u0430\u0442\u044c, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438.<\/p>\n<p><em>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u2014\u00a0\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0438 <\/em><a href=\"https:\/\/dev.to\/kirekov\"><em><u>\u0441\u0442\u0430\u0442\u044c\u0438<\/u><\/em><\/a><em>. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0432 \u043d\u0438\u0445 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0434\u043b\u044f \u0441\u0435\u0431\u044f.<\/em><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/rosbank\/blog\/695360\/\"> https:\/\/habr.com\/ru\/company\/rosbank\/blog\/695360\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/kirekov\/posts\/\">\u0421\u0435\u043c\u0451\u043d \u041a\u0438\u0440\u0435\u043a\u043e\u0432<\/a>, \u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u0442\u0438\u043c\u043b\u0438\u0434 \u0432 \u0426\u0435\u043d\u0442\u0440\u0435 Big Data @<a href=\"https:\/\/habr.com\/ru\/company\/ru_mts\/blog\/\"><u>\u041c\u0422\u0421 Digital<\/u><\/a> \u0438 Java-\u0434\u0435\u043a\u0430\u043d \u0432 <a href=\"https:\/\/www.teta.mts.ru\/\"><u>\u041c\u0422\u0421 \u0422\u0435\u0442\u0430<\/u><\/a> \u2014\u00a0\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u041c\u0422\u0421. \u041d\u0430 <a href=\"https:\/\/habr.com\/ru\/company\/rosbank\/news\/t\/685722\/\"><u>\u043c\u0438\u0442\u0430\u043f\u0435 \u0420\u043e\u0441\u0431\u0430\u043d\u043a\u0430 \u0438 Jug.ru<\/u><\/a> \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043c\u0435\u0442\u043e\u0434 Save \u0432 Spring Data JPA, \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0439 select, \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u043f\u0440\u0438 \u0447\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f Spring. \u0417\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0441 \u0432\u0430\u043c\u0438.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c Post. \u0423 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c id, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0439, \u0438 \u0442\u0430\u0439\u0442\u043b:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Setter @Getter public class Post {   @Id   @GeneratedValue(strategy = IDENTITY)   private Long id;   private String title; }<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c PostService, \u043c\u044b \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u043c \u0432 \u043d\u0435\u0433\u043e PostRepository, \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Spring Data JPA \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u0418 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 changeTitle, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Post. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 Transactional; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434 \u2014\u00a0\u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f. \u0412 \u043d\u0435\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c id, \u043d\u043e\u0432\u044b\u0439 \u0442\u0430\u0439\u0442\u043b \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 save.\u00a0<\/p>\n<pre><code class=\"java\">@Service public class PostService {   private final PostRepository postRepository;    @Transactional   public void changeTitle(Long postId, String title) {     final var post = postRepository.findById(postId).orElseThrow();     post.setTitle(title);     postRepository.save(post);   } } <\/code><\/pre>\n<p>\u0423\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0432 \u0442\u043e\u043c \u0438\u043b\u0438 \u0438\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438 \u0442\u0430\u043a\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 HQL. \u041d\u0430\u0448\u043b\u0438 \u043f\u043e\u0441\u0442, \u043f\u0440\u043e\u0430\u043f\u0434\u0435\u0439\u0442\u0438\u043b\u0438 \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b?<\/p>\n<p><code>Hibernate: select post0_.id as id1_0_0_, post0_.description as descript2_0_0_, post0_.title as title3_0_0_ from post post0_ where post0_.id=? Hibernate: update post set description=?, title=? where id=?<\/code><\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043c\u0435\u0442\u043e\u0434 save. EntityInformation.isNew \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0447\u0442\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c persist, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014\u00a0merge:<\/p>\n<pre><code class=\"java\">@Transactional @Override public &lt;S extends T> S save(S entity) {    Assert.notNull(entity, \"Entity must not be null.\");    if (entityInformation.isNew(entity)) {     em.persist(entity);     return entity;   } else {   return em.merge(entity);   } }<\/code><\/pre>\n<h3>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b entity \u0432 JPA<\/h3>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 JPA:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043e\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Transient \u2014\u00a0\u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Hibernate. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Managed \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f Hibernate \u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 HQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b (update, insert, delete \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435). \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Managed \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0435 \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043b\u0438\u0431\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u043f\u043e id (find getReference). \u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 flush \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432\u044b \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Removed: \u0435\u0441\u043b\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u043d\u0435\u0433\u043e, \u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d delete. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 delete \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 remove, \u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0447\u0435\u0440\u0435\u0437 persist.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e Detached. \u0415\u0441\u043b\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u0443 \u0432\u0430\u0441 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Managed, \u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u043b\u0430\u0441\u044c, \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Detached. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c id, \u043e\u043d\u0430 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043b\u0430\u0441\u044c, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e persistent-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0432\u044b \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0441 Post \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u0442\u043e\u0434. \u0422\u0430\u043c \u0443\u0436\u0435 \u044d\u0442\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 Detached. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 detach (\u043e\u043d \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c). \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0442\u043e \u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 merge. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0435 Post \u0438 \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043b\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438?<\/p>\n<ul>\n<li>\n<p>Dirty Checking, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 save.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f merge \u0434\u043b\u044f PERSISTED \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 save \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f merge.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0441 @Transactional \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c save \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f, \u0430\u043f\u0434\u0435\u0439\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"java\">final var post = postRepository.findById(postId).orElseThrow();   post.setTitle(title); }<\/code><\/pre>\n<h3>\u041c\u0435\u0442\u043e\u0434 copyValues<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 Hibernate:<\/p>\n<pre><code class=\"java\">protected void entityIsPersistent(MergeEvent event, Map copyCache) {   LOG.trace( \"Ignoring persistent instance\" );    \/\/TODO: check that entry.getIdentifier().equals(requestedId)    final Object entity = event.getEntity();   final EventSource source = event.getSession();   final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );     ( (MergeContext) copyCache ).put( entity, entity, true ); \/\/before cascade! cascadeOnMerge( source, persister, entity, copyCache );   copyValues( persister, entity, entity, source, copyCache );    event.setResult( entity ); }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 copyValues. Hibernate \u0434\u043e\u0441\u0442\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (entity), \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432 \u0441\u0432\u043e\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e Entity. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u044f\u043d\u0443\u0442\u044c\u0441\u044f. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442 \u0446\u0438\u043a\u043b\u044b \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 merge \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0434\u043b\u044f MANAGED entity? \u0415\u0441\u043b\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 entity \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d copyValues \u0438 \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0438\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432 entity \u043c\u043d\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432.<\/p>\n<p>\u042f \u0437\u0430\u0434\u0430\u043b\u0441\u044f <a href=\"https:\/\/stackoverflow.com\/questions\/73471541\/hibernate-why-copyvalues-is-called-during-merge-event-for-persistent-entities\"><u>\u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c<\/u><\/a>: \u0430 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u0435\u043d copyValues? \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u044f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u044d\u0442\u043e, \u0432\u0438\u0434\u0438\u043c\u043e, \u043a\u043e\u0441\u0442\u044b\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0441\u0442\u0430\u043b \u0444\u0438\u0447\u0435\u0439. \u0421\u0443\u0442\u044c \u0432\u043e\u0442 \u0432 \u0447\u0435\u043c: \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0435 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e, \u0442\u043e \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f one to many \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0415\u0441\u043b\u0438 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Detached, \u0442\u043e \u0432\u044b\u0437\u043e\u0432 copyValues \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0438\u0445 \u043d\u0430 \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 entity \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Managed. \u0422\u0430\u043a Hibernate \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0437\u0430\u0447\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u043d\u043e, \u0432\u0438\u0434\u0438\u043c\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0438 \u0442\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u0436\u0435 Post, \u043d\u043e \u0441 id \u0432 \u0432\u0438\u0434\u0435 UUID. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0430\u0437\u043e\u0439:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"post\") @Getter @Setter public class Post {   @Id   private UUID id;    private String title;    public static Post newPost() {     final var post = new Post();     post.setId(UUID.randomUUID());     return post;   } }<\/code><\/pre>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0441\u0442, \u0430 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e. \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0441\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Transient, \u0442\u043e \u0435\u0441\u0442\u044c Hibernate \u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442. \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c save. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043b\u043e\u0433\u0430\u0445:<\/p>\n<p><code>Hibernate: select post0_.id as id1_1_0_,<br \/> post0_.description as descript2_1_0_,<br \/> post0_.title as title3_1_0_<br \/> from post post0_ where post0_.id=?<br \/>Hibernate: insert into post (description, title, id) values (?, ?, ?)<\/code><\/p>\n<p>Select \u0431\u0443\u0434\u0435\u0442 \u0443 \u043d\u0430\u0441 \u043f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 id, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 insert. \u0422\u043e \u0435\u0441\u0442\u044c Hibernate \u0434\u0435\u043b\u0430\u0435\u0442 select, \u0430 \u043f\u043e\u0442\u043e\u043c insert. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c breakpoint, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u0441\u044f merge, \u0430 \u043d\u0435 persist:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 isNew<\/h3>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 EntityInformation.isNew. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 Spring Data \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 entity \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f version. \u0415\u0441\u043b\u0438 \u0435\u0435 \u043d\u0435\u0442 \u043b\u0438\u0431\u043e \u0442\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432, \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443. \u0415\u0441\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 version \u0435\u0441\u0442\u044c, \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u043d null. \u0415\u0441\u043b\u0438 \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u043d\u043e\u0432\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e, \u0430 \u043d\u0435 \u0432\u0437\u044f\u0442\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u044b. \u0423 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 version, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 Spring Data JPA \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 id \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u043c.<\/p>\n<pre><code class=\"java\">public boolean isNew(T entity) {  ID id = getId(entity); Class&lt;ID> idType = getIdType();      if (!idType.isPrimitive()) {   return id == null; }  if (id instanceof Number) {   return ((Number) id).longValue() == 0L; }  throw new IllegalArgumentException(   String.format(\"Unsupported primitive id type %s\", idType) ); }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e null, \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0438 \u0447\u0438\u0441\u043b\u043e \u2014 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u043d\u043e \u043d\u0443\u043b\u044e. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u044b char \u0438 boolean, \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u0440\u043e\u043b\u044c \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430.<\/p>\n<p>\u041e\u0431\u043e\u0431\u0449\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b isNew \u0432 Spring Data JPA:<\/p>\n<ol>\n<li>\n<p>New, \u0435\u0441\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 @Version \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0440\u0430\u0432\u0435\u043d null.<\/p>\n<\/li>\n<li>\n<p>New, \u0435\u0441\u043b\u0438 ID \u0440\u0430\u0432\u0435\u043d null.<\/p>\n<\/li>\n<li>\n<p>New, \u0435\u0441\u043b\u0438 ID \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0438 \u0440\u0430\u0432\u0435\u043d 0.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0430\u0447\u0435 \u2014 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f new.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u0438 \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 merge. \u0412\u043e\u0442 \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"java\">final PersistenceContext persistenceContext = source.getPersistenceContextInternal(); EntityEntry entry = persistenceContext.getEntry( entity ); if ( entry == null ) {   EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );   Serializable id = persister.getIdentifier( entity, source );   if ( id != null ) {     final EntityKey key = source.generateEntityKey( id, persister );     final Object managedEntity = persistenceContext.getEntity( key );     entry = persistenceContext.getEntry( managedEntity );     if ( entry != null ) {        entityState = EntityState.DETACHED;     }   } }  if ( entityState == null ) {   entityState = EntityState.getEntityState( entity, event.getEntityName(), entry, source, false ); }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Hibernate. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043e\u043d \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u044d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435. Hibernate \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0430\u043f\u0434\u0435\u0439\u0442\u0438\u0442\u044c, \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0437\u0430\u0438\u043d\u0441\u0435\u0440\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0451.<\/p>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u0434\u0443. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 Hibernate \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432 PersistenceContext. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438, \u0442\u043e \u0442\u0430\u043c \u043f\u0443\u0441\u0442\u043e \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438, \u043e\u043d \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u043e id. \u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0441\u0442, \u0442\u0430\u043c \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u2014\u00a0\u0432\u044b\u0437\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 get EntityState.<\/p>\n<pre><code class=\"java\">final Serializable clonedIdentifier =   (Serializable) persister.getIdentifierType().deepCopy( id, source.getFactory() ); final Object result = source.get( entityName, clonedIdentifier ); source.getLoadQueryInfluencers().setInternalFetchProfile( previousFetchProfile ); if ( result == null ) {   entityIsTransient( event, copyCache ); }<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0412 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0441 source.get \u0438<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-340220","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/340220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=340220"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/340220\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=340220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=340220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=340220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}