我正在尝试将JPA @Embeddable与Hibernate 一起使用。实体和可嵌入对象都具有一个名为的属性id:
@Embeddable
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。
org.hibernate.MappingException: component property not found: id
我想避免使用@AttributeOverrides。因此,我试图进行设置spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.DefaultComponentSafeNamingStrategy(我正在使用Spring Boot)。这没有任何效果(相同的例外)。但是,我怀疑设置会被忽略,因为指定不存在的类不会引发异常。
@AttributeOverrides
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.DefaultComponentSafeNamingStrategy
奇怪的是,即使使用此变体
@Entity public class C extends A { @Embedded @AttributeOverrides( { @AttributeOverride(name="id", column = @Column(name="b_id") ), } ) B b; }
我仍然遇到相同的错误。
命名策略配置已更改。根据Spring Boot文档的新方法是:
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
另外,您不得@Id在中使用@Embeddable。因此,我@MappedSuperclass为可嵌入对象创建了单独的对象:
@Id
@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就有两列id和b_id。缺点当然是的A,并E介绍一些redundency。非常欢迎对此提出DRY方法的意见。
C
b_id
A
E