小编典典

Hibernate可嵌入对象:找不到组件属性

spring-boot

我正在尝试将JPA @Embeddable与Hibernate 一起使用。实体和可嵌入对象都具有一个名为的属性id

@MappedSuperclass
public abstract class A {
    @Id
    @GeneratedValue
    long id;
}

@Embeddable
public class B extends A {

}

@Entity
public class C extends A {
    B b;
}

这引起了org.hibernate.MappingException: component property not found: id

我想避免使用@AttributeOverrides。因此,我试图进行设置spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.DefaultComponentSafeNamingStrategy(我正在使用Spring
Boot)。这没有任何效果(相同的例外)。但是,我怀疑设置会被忽略,因为指定不存在的类不会引发异常。

奇怪的是,即使使用此变体

@Entity
public class C extends A {
    @Embedded
    @AttributeOverrides( {
        @AttributeOverride(name="id", column = @Column(name="b_id") ),
    } )
    B b;
}

我仍然遇到相同的错误。


阅读 511

收藏
2020-05-30

共1个答案

小编典典

命名策略配置已更改。根据Spring Boot文档的新方法是:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl

另外,您不得@Id在中使用@Embeddable。因此,我@MappedSuperclass为可嵌入对象创建了单独的对象:

@MappedSuperclass
public abstract class A {
    @Id
    @GeneratedValue
    long id;
}

@MappedSuperclass
public abstract class E {
    @GeneratedValue
    long id;
}

@Embeddable
public class B extends E {

}

@Entity
public class C extends A {
    B b;
}

这样,表格C就有两列idb_id。缺点当然是的A,并E介绍一些redundency。非常欢迎对此提出DRY方法的意见。

2020-05-30