2015-08-12 9 views
5

Essendo nuovo in ORM, mi piacerebbe trovare un modo per definire un mapping semplice (significato senza un'ulteriore entità) per un elenco (o un insieme) di stringhe all'interno di un'entità. Ho trovato questo esempio:Mappatura JPA per un elenco o un set <String>

import java.util.Set; 

import javax.persistence.CollectionTable; 
import javax.persistence.Column; 
import javax.persistence.ElementCollection; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

@Entity 
public class Book { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @ElementCollection 
    @CollectionTable(name = "tags") 
    private Set<String> tags; 

    public Long getId() { 
    return id; 
    } 

    public void setId(Long id) { 
    this.id = id; 
    } 

    public Set<String> getTags() { 
    return tags; 
    } 

    public void setTags(Set<String> tags) { 
    this.tags = tags; 
    } 
} 

che sembra corrispondere alle mie esigenze. Tuttavia, l'elaborazione di questa classe con Eclipse di hibernate3-maven-plugin:2.2:hbm2ddl, io alla fine con il seguente errore:

[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]

specificare @ElementCollection(targetClass=String.class) non ha aiutato. L'aggiunta di una definizione di colonna al tags campo (@Column(name = "tags", columnDefinition="character varying (255)", nullable = false)) porta ad un accumulo di successo, ma produce questo SQL:

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

che non è quello che voglio, come mi aspettavo di finire con un tavolo tags legata ai libri tavolo. Qualcuno potrebbe indicarmi la giusta direzione? Grazie.

risposta

2

@ElementCollection è stato introdotto in JPA v 2.0: la mappatura che hai fatto è corretta. Tuttavia assicurati che il plugin di ibernazione di Maven che utilizzi sia nella versione corretta. Hibernate stesso è compatibile con JPA 2.0 a partire dalla versione 3.5.

+0

W00t! Grazie. In effetti il ​​plugin utilizzava una vecchia versione di Hibernate. L'aggiornamento del pom a una versione più recente ha risolto il problema. – Blablalux

0

Si dovrebbe creare una tabella Tag: tag_id pk, libro_id fk riferimenti id dal libro e tutte le altre colonne che si desidera e mappa si elenco con qualcosa di simile:

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

creare la classe tag con tutte le colonne da base di dati + un nome libro oggetto libro per exemple e mappare questo libro con:

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

almeno questo è come vorrei gestirlo, ma sono anche nuovo di ibernare – dskfdskjgds

+0

Grazie per la risposta. Sì, lo so che la soluzione sarebbe adatta. Tuttavia, ho specificamente menzionato che non voglio creare un'entità aggiuntiva. Penso che questo sia lo scopo delle annotazioni '@ ElementCollection' e' @ CollectionTable'. – Blablalux

Problemi correlati