2016-08-19 58 views
1

我試圖在Hibernate中使用JPA @Embeddable。實體和嵌入式都有一個屬性命名idHibernate嵌入式:未找到組件屬性

@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; 
} 

我仍然得到同樣的錯誤。

回答

1

命名策略配置已更改。新的方式爲每Spring Boot documentation是這樣的:

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

而且,你不能一個@Embeddable中使用@Id。因此,我創建了embeddables一個單獨@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。不利的一面是AE引入了一些redundency。有關DRY方法的評論非常受歡迎。