Я пытаюсь получить обратные вызовы, связанные с жизненным циклом компонентов 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/, кажется, мало активен.
Спасибо!