2015-08-12 17 views
5

Będąc nowością w ORM, chciałbym znaleźć sposób na zdefiniowanie prostego (czyli bez dodatkowego obiektu) mapowania dla listy (lub zestawu) łańcuchów w jednostce. Znalazłem tę próbkę:Mapowanie JPA dla listy lub zestawu <String>

która wydaje się pasować do moich potrzeb. Jednak przetwarzanie tę klasę z Eclipse hibernate3-maven-plugin:2.2:hbm2ddl, ja skończyć z powodu następującego błędu:

[ERROR] Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2ddl (default) on project test-database: Execution default of goal org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2ddl failed: Could not determine type for: java.util.Set, at table: Book, for columns: [org.hibernate.mapping.Column(tags)] -> [Help 1]

Określanie @ElementCollection(targetClass=String.class) nie pomogło. Dodanie definicji kolumny do pola tags (@Column(name = "tags", columnDefinition="character varying (255)", nullable = false)) prowadzi do udanej kompilacji ale daje to SQL:

create table Book (
    id int8 not null, 
    tags character varying (255) not null, 
    primary key (id) 
); 

który nie jest to, co chcę, jak spodziewałem się skończyć z tags stołu związanego z książek stół. Czy ktoś może wskazać mi właściwy kierunek? Dziękuję Ci.

Odpowiedz

2

@ElementCollection został wprowadzony w JPA v 2.0: mapowanie zrobiłeś jest poprawna. Upewnij się jednak, że używana wtyczka hibernacji maven jest w prawidłowej wersji. Hibernate sam w sobie jest zgodny z JPA 2.0 począwszy od wersji 3.5.

+0

W00t! Dziękuję Ci. Rzeczywiście wtyczka używa starej wersji Hibernate. Aktualizacja pom do nowszej wersji rozwiązała problem. – Blablalux

0

Należy utworzyć tabelę Tag: tag_id PK, book_id fk referencje id z książki i innych kolumn, które mają i mapie listy z czymś takim:

@OneToMany(mappedBy="book",fetch=FetchType.LAZY, cascade=CascadeType.REMOVE) 

utworzyć klasę tag ze wszystkich kolumn z bazy + obiekt o nazwie Book książki dla exemple i mapa z tej książki:

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="id",insertable=false,updatable=false) 
+0

Przynajmniej tak powinienem sobie z tym poradzić, ale jestem też nowy w hibernacji – dskfdskjgds

+0

Dziękuję za odpowiedź. Tak, wiem, że twoje rozwiązanie pasuje. Wspomniałem jednak wyraźnie, że nie chcę tworzyć dodatkowego podmiotu. Myślę, że to jest cel adnotacji '@ ElementCollection' i' @ CollectionTable'. – Blablalux