我正在从 Spring Boot 2.x 迁移到 3.x,并且还将 Hibernate 5.x 迁移到 6x,并且我的实体上有以下字段:
@NotNull
@CollectionTable(
joinColumns = @JoinColumn(name = "e_end_status"),
name = "ex_active_monitor_end_status",
foreignKey = @ForeignKey(name = "exFk_monitor_end_trigger")
)
@OnDelete(action = OnDeleteAction.CASCADE)
@ElementCollection(targetClass = String.class, fetch = FetchType.EAGER)
public List<String> getEndStatus() {
return endStatus;
}
当我开始应用程序时它会抱怨
Caused by: org.hibernate.AnnotationException: Unidirectional '@OneToMany' association 'domain.timemonitoring.ActiveTimeMonitoring.endStatus' is annotated '@OnDelete' and must explicitly specify a '@JoinColumn'
at org.hibernate.boot.model.internal.CollectionBinder.detectMappedByProblem(CollectionBinder.java:1291)
at org.hibernate.boot.model.internal.CollectionBinder.bind(CollectionBinder.java:1189)
但是,当我添加
@JoinColumn
时,它会抱怨这一点。
Caused by: org.hibernate.AnnotationException: Property 'domain.timemonitoring.ActiveTimeMonitoring.endStatus' is a '@ElementCollection' and is directly annotated '@JoinColumn' (specify '@JoinColumn' inside '@JoinTable' or '@CollectionTable')
at org.hibernate.boot.model.internal.CollectionBinder.checkAnnotations(CollectionBinder.java:446)
at org.hibernate.boot.model.internal.CollectionBinder.bindCollection(CollectionBinder.java:278)
at org.hibernate.boot.model.internal.PropertyBinder.bindProperty(PropertyBinder.java:874)
at org.hibernate.boot.model.internal.PropertyBinder.buildProperty(PropertyBinder.java:788)
at org.hibernate.boot.model.internal.PropertyBinder.processElementAnnotations(PropertyBinder.java:709)
at org.hibernate.boot.model.internal.EntityBinder.processIdPropertiesIfNotAlready(EntityBinder.java:1026)
at org.hibernate.boot.model.internal.EntityBinder.handleIdentifier(EntityBinder.java:354)
at org.hibernate.boot.model.internal.EntityBinder.bindEntityClass(EntityBinder.java:234)
at org.hibernate.boot.model.internal.AnnotationBinder.bindClass(AnnotationBinder.java:423)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:256)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:279)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:322)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1432)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1503)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75)
使用以下代码,它可以在
hibernate 5.x
中运行
@NotNull
@JoinColumn
@CollectionTable(
name = "ex_active_monitor_end_status",
foreignKey = @ForeignKey(name = "exFk_monitor_end_trigger")
)
@OnDelete(action = OnDeleteAction.CASCADE)
@ElementCollection(targetClass = String.class, fetch = FetchType.EAGER)
public List<String> getEndStatus() {
return endStatus;
}
有什么办法可以解决这个问题吗? (
hibernate 6.4.1
)
要避免此异常,您只需删除
@OnDelete(action = OnDeleteAction.CASCADE)
即可。
@ElementCollection
不是独立的实体,Hibernate 会自动所有操作级联,而无需明确指示 CascadeType
。
然后如果你想让你的数据库FK
ON DELETE CASCADE
同时schema DDL命令,你可以将它添加到foreignKeyDefinition
:
@CollectionTable(
...
foreignKey = @ForeignKey(name = "exFk_monitor_end_trigger", foreignKeyDefinition = "foreign key (...) references ... on delete cascade")
)
但即使在这种情况下,Hibernate 首先也会尝试通过单独的查询删除该子元素。
我遇到了同样的问题,并且没有发现先前工作功能的批准或第六版本“损坏”。也许这是一个未记录的功能。 此处所写内容表明当前行为符合此类关系的预期。