События жизненного цикла в Embedabbles в коллекциях, не вызванных с помощью Hibernate - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь получить обратные вызовы, связанные с жизненным циклом компонентов Embeddable, используя Hibernate 5.4.10.Final. Мне удалось обнаружить ошибку, которая, по-видимому, связана с этой проблемой https://hibernate.atlassian.net/browse/HHH-12326, но в ней говорится, что проблема была исправлена ​​в более ранних версиях Hibernate, и я определенно все еще вижу проблему в коллекциях Embeddable.

Я взял пример из https://javabydeveloper.com/mapping-collection-of-embeddablecomposite-types-jpa-with-hibernate/ и немного изменил его, чтобы проиллюстрировать проблему

Я поместил пример приложения здесь https://github.com/pzieminski/collection-of-embeddables1

create table user
(
 id           int primary key,
 user_name    text,
 password     text,
 created_time datetime,
 updated_time datetime,
 user_type    text
);

create table contact_address
(
 street_address text,
 state          text,
 city           text,
 zip_code       text,
 user_id        int references user,
 addr_type      text
);

create table contact
(
 contact_ text,
 id       int references user
);

Тогда у меня бобы

@Data
@Entity(name = "user")
public class User {

   @Id
   @Column(name = "id")
   private Integer id;

   @Column(name = "user_name")
   private String userName;

   @Column(name = "password")
   private String password;

   @Embedded
   private Audit audit = new Audit();

   @ElementCollection
   @CollectionTable(name = "contact_address", joinColumns = @JoinColumn(name = "user_id"))
   @AttributeOverride(name = "streetAddress", column = @Column(name = "street_address"))
   private List<ContactAddress> address;

   @ElementCollection
   @CollectionTable(name = "contact", joinColumns = @JoinColumn(name = "id"))
   @Column(name = "contact no")
   private Collection<String> contacts;

   @Enumerated(value = EnumType.STRING)
   @Column(name = "user_type")
   private UserType userType;

   @PrePersist
   public void prePersist() {
       System.out.println("User#prePersist"); // called
   }

}

@Embeddable
public class Audit {

   @Temporal(value = TemporalType.TIMESTAMP)
   @Column(name = "created_time")
   private Date creationTime;

   @Temporal(value = TemporalType.TIMESTAMP)
   @Column(name = "updated_time")
   private Date updatedTime;

   @PrePersist
   public void prePersist() {
       System.out.println("Audit#prePersist"); // called
   }
}

@Data
@Embeddable
public class ContactAddress {

   @Column(name = "street")
   private String streetAddress;

   @Column(name = "state")
   private String state;

   @Column(name = "city")
   private String city;

   @Column(name = "zip_code")
   private String areaCode;

   @Column(name = "addr_type")
   private String addressType;

   @PrePersist
   public void prePersist() {
       System.out.println("ContactAddress#prePersist"); // NOT called
   }
}

И во взаимодействии ниже @PrePersist на ContactAddress не вызывается. Он вызывается на Audit.

txRunner.runInNewTransaction(() -> {
   User user = new User();
   user.setId(1);
   user.setUserName("J Doe");

   ContactAddress address = new ContactAddress();
   address.setCity("Las Vegas");
   address.setState("NV");

   user.setAddress(Collections.singletonList(address));
   em.persist(user);
});

Это ошибка? Ожидаемая? Кто-нибудь еще сталкивался с этим?

Кто-нибудь знает, где еще я мог бы ответить на этот вопрос? https://discourse.hibernate.org/, кажется, мало активен.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...