web-dev-qa-db-fra.com

Mapper une liste de chaînes avec des annotations JPA/Hibernate

Je veux faire quelque chose comme ça:

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

et que les Foos persistent dans un tableau comme celui-ci:

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

METTRE À JOUR:

Je sais comment cartographier d'autres entités, mais c'est souvent excessif. Il semble que ce que je suggère n'est pas possible sans créer une autre entité ou se retrouver avec tout dans une colonne blob.

21
danb

Ceci est en termes Hibernate une "collection de valeurs" ou "éléments". Il existe une annotation (spécifique à Hibernate) pour cela. JPA ne le supporte pas (encore).

En bref, annotez votre collection comme ceci:

@CollectionOfElements
@JoinTable(
        table=@Table(name="..."),
        joinColumns = @JoinColumn(name="...") // References parent
)
@Column(name="...value...", nullable=false)

Cela créera la table nécessaire avec des clés étrangères et des restrictions.

27
Maarten Winkels

Voici comment procéder si vous utilisez JPA2: 

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

   @ElementCollection
   @CollectionTable(name="foo_bars", joinColumns=@JoinColumn(name="bar_id"))
   @Column(name="foo")
   List<String> Foos;
 }

Pour un exemple plus clair, reportez-vous à la section 2.2.5.3.3 de le Guide de référence Hibernate Annotations .

28
Max Z

Si vous stockez votre liste sous forme de tableau, cela fonctionne:

setFoos(String[] foos);

vous pouvez le transformer comme ça:

setFoos(myList.toArray(new String[myList.size()]));
4
Renaud
Here 'Foos' is List of String, So it is unidirectional. We can do this in one model class using @ElementCollection annotation.

@Entity 
@Table(name="bar")
public class Bar {

        @Id @GeneratedValue 
        long id;

        @ElementCollection
        @JoinTable(
            name="foo_bars",
            joinColumns = @JoinColumn( name="bar_id")
          )
        @Column(name="foo")
        List<String> Foos;
    }

Dans la base de données bar_id est la clé étrangère dans la table foo_bars

0
kranti

créer une entité 'FooBars'

refactoriser l'attribut 'Aliments' à

@OneToMany List Foos

0
Michael Pralow

Je pense que c'est ce dont vous avez besoin:

@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;
}
0
Vanger