2009-04-28 19 views
21

que quiero hacer algo como esto:asignar una lista de cadenas con JPA/Hibernate anotaciones

@Entity public class Bar { 
     @Id @GeneratedValue long id; 
     List<String> Foos 
    } 

y tiene la Foos persisten en una tabla como la siguiente:

foo_bars (
    bar_id int, 
    foo varchar(64) 
); 

ACTUALIZACIÓN:

Sé cómo mapear otras entidades, pero es excesivo en muchos casos. Parece que lo que sugiero no es posible sin crear otra entidad o terminar con todo en alguna columna de blob.

Respuesta

27

Esto es en Hibernate terms una "colección de valores" o "elementos". Hay una anotación (específica de Hibernate) para ello. JPA no es compatible con esto (todavía).

En resumen, anotar su colección como esta:

@CollectionOfElements 
@JoinTable(
     [email protected](name="..."), 
     joinColumns = @JoinColumn(name="...") // References parent 
) 
@Column(name="...value...", nullable=false) 

Esto creará la tabla es necesario con las claves externas y restricciones.

+28

A partir de JPA 2, puede hacerlo de forma portátil con la anotación ElementCollection, que es básicamente una versión estandarizada de CollectionOfElements, y le permite tener colecciones de Embeddables o tipos básicos, que incluyen cadenas: http: //en.wikibooks. org/wiki/Java_Persistence/ElementCollection –

0

crear una entidad '' FooBars

refactor la attribut 'Foos a

@OneToMany Lista Foos

+1

Gracias, Michael, pero esperaba evitar otra entidad aquí ... Realmente solo necesito la cuerda en cualquier caso ... Esperaba que hibernate me ocupara de todo. – danb

0

Estoy creo que es eso lo que necesita:

@Entity 
public class Bar { 
    @Id @GeneratedValue long id; 

    @OneToMany(mappedBy="bar") //"bar" = field name in mapping class 
    List<FooBar> Foos; 
} 

@Entity 
public class FooBar { 
    @Id @GeneratedValue long id; 

    @ManyToOne 
    @JoinColumn(name="bar_Id") 
    Bar bar; 
} 
+3

gracias Vanger, pero esperaba evitar otra entidad aquí ... Realmente solo necesito la cuerda en cualquier caso ... Esperaba que hibernate me ocupara de todo. – danb

3

Si almacena su lista como una matriz, funciona:

setFoos(String[] foos); 

se puede transformar de esta manera:

setFoos(myList.toArray(new String[myList.size()])); 
27

Aquí es cómo podría hacer esto si está utilizando JPA2:

@Entity public class Bar { 
    @Id @GeneratedValue long id; 

    @ElementCollection 
    @CollectionTable(name="foo_bars", [email protected](name="bar_id")) 
    @Column(name="foo") 
    List<String> Foos; 
} 

Para un ejemplo más claro ver sección 2.2.5.3.3 en the Hibernate Annotations Reference Guide.

Cuestiones relacionadas