2016-01-04 9 views
5

posiadające zabudowany klasy MultiLanguageText:pole Wbudowany nie działa po uaktualnieniu do hibernacji 5.0.6.Final w Spring Boot 1.3.1.RELEASE

@Embeddable 
public class MultiLanguageText { 
@Field 
private String textDe; 
@Field 
private String textFr; 
@Field 
private String textIt; 
//... 
} 

a inna klasa, która używa tej klasy dwukrotnie:

@Entity(name = "T_AnotherClass") 
public class AnotherClass{ 
@Id 
@GeneratedValue 
private long key; 
@Embedded 
private MultiLanguageText name; 
@Embedded 
private MultiLanguageText description; 
//... 
} 

Pola zostały dokładnie przetłumaczone na "name_textDe", "description_textDe", "name_textFr" itd. Wiosną w wersji 1.2.7.RELEASE.

jednak przechowywać LOCALDATE użytkownika chciałem uaktualnić do hibernacji 5. I następuje proces opisany tutaj: https://github.com/spring-projects/spring-boot/issues/2763#issuecomment-154419889

Proces pracował w porządku, ale tłumaczenie wbudowanych pól zatykać pracy *. Próbowałem różnych implicit_naming_strategy i physical_naming_strategy, ale żaden z nich nie działał.

Gdybym opisywanie pola w następujący sposób to działa, ale proces ten jest nieco kłopotliwe:

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

* Nie działa znaczy dostaję coś wyjątku wzdłuż linii (jak teraz pole zostaje odwzorowany bez prefiksu pola stare_pole i dlatego dziedzinie istnieją dwa razy):

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 

Odpowiedz

1

Hibernate oficjalna dokumentacja mówi:

Jeśli chcesz mieć ten sam osadzalny typ obiektu dwa razy w tej samej jednostce , domyślna nazwa kolumny nie będzie działać, ponieważ kilka osadzonych obiektów będzie miało ten sam zestaw kolumn. W prostym JPA musisz zastąpić co najmniej jeden zestaw kolumn. Hibernacja pozwala jednak na zwiększenie domyślnego mechanizmu nazewnictwa za pomocą interfejsu NamingStrategy . Możesz napisać strategię, która zapobiegnie konfliktowi nazw w takiej sytuacji. Przykładem tego jest DefaultComponentSafeNamingStrategy.

W związku z tym, jeśli chcesz mieć pełną zgodność z JPA, trzymaj się swojej obecnej implementacji.

9

Aby rozwiązać ten problem w Spring Boot 1.4, dodać to do Twojego application.yaml:

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

Od javadocs:

realizacja

ImplicitNamingStrategy który wykorzystuje pełen kompozytowe ścieżki wydobyte z AttributePath, w przeciwieństwie do tylko części terminalowej . Głównie port starszej klasy DefaultComponentSafeNamingStrategy, która implementuje już podpisaną umowę NamingStrategy z .

+0

Po wykonaniu tej czynności nie można używać pola @CollectionTable w dowolnym miejscu, ponieważ pola są mapowane jako parent_field_collection && element_child_field. Kolekcja && element pochodzi ze strategii nazewnictwa i powoduje błąd składni sql – aycanadal

Powiązane problemy