Hibernate 6 OnDelete 与 CollectionTable 导致问题

问题描述 投票:0回答:1

我正在从 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
)

hibernate
1个回答
0
投票

要避免此异常,您只需删除

@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 首先也会尝试通过单独的查询删除该子元素。

我遇到了同样的问题,并且没有发现先前工作功能的批准或第六版本“损坏”。也许这是一个未记录的功能。 此处所写内容表明当前行为符合此类关系的预期。

© www.soinside.com 2019 - 2024. All rights reserved.