leo*_*leo 5 java hibernate spring-boot
有一个可嵌入的类MultiLanguageText:
@Embeddable
public class MultiLanguageText {
@Field
private String textDe;
@Field
private String textFr;
@Field
private String textIt;
//...
}
Run Code Online (Sandbox Code Playgroud)
另一个使用这个类两次的类:
@Entity(name = "T_AnotherClass")
public class AnotherClass{
@Id
@GeneratedValue
private long key;
@Embedded
private MultiLanguageText name;
@Embedded
private MultiLanguageText description;
//...
}
Run Code Online (Sandbox Code Playgroud)
使用spring版本1.2.7.RELEASE将字段完全转换为"name_textDe","description_textDe","name_textFr"等等.
但是为了存储LocalDate,我想升级到Hibernate 5.我按照这里描述的过程:https://github.com/spring-projects/spring-boot/issues/2763#issuecomment-154419889
这个过程运行良好,但嵌入式字段的转换停止工作*.我尝试了不同的implicit_naming_strategy和physical_naming_strategy,但没有使用它们.
如果我按如下方式注释字段它确实有效,但过程有点麻烦:
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "textDe", column = @Column(name = "name_textDe", length = MultiLanguageText.MAX_TEXT_LENGTH)),
@AttributeOverride(name = "textFr", column = @Column(name = "name_textFr", length = MultiLanguageText.MAX_TEXT_LENGTH)),
@AttributeOverride(name = "textIt", column = @Column(name = "name_textIt", length = MultiLanguageText.MAX_TEXT_LENGTH)),
})
private MultiLanguageText name;
Run Code Online (Sandbox Code Playgroud)
*不工作意味着我得到一个例外的东西(因为现在字段被映射而没有字段名前缀,因此该字段存在两次):
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: AnotherClass column: textDe (should be mapped with insert="false" update="false")
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:764)
at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:782)
at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:778)
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:804)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:539)
at org.hibernate.mapping.RootClass.validate(RootClass.java:265)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
... 48 more
Run Code Online (Sandbox Code Playgroud)
要在Spring Boot 1.4中修复此问题,请将其添加到您的application.yaml:
spring.jpa.hibernate.naming.implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
Run Code Online (Sandbox Code Playgroud)
来自javadocs:
ImplicitNamingStrategy实现,它使用从AttributePath中提取的完整复合路径,而不仅仅是终端属性部分.主要是旧的DefaultComponentSafeNamingStrategy类的一个端口,它实现了不再支持的NamingStrategy合约.
Hibernate官方文档说:
如果您希望在同一实体中两次使用相同的可嵌入对象类型,则默认的列名称将不起作用,因为多个嵌入对象将共享同一组列。在普通 JPA 中,您需要覆盖至少一组列。然而,Hibernate 允许您通过 NamingStrategy 接口增强默认命名机制。您可以编写一个策略来防止在这种情况下发生名称冲突。DefaultComponentSafeNamingStrategy 就是一个例子。
因此,如果您希望完全遵守 JPA,请坚持当前的实施。
| 归档时间: |
|
| 查看次数: |
1756 次 |
| 最近记录: |