Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Map a list of strings with JPA/Hibernate annotations

I want to do something like this:

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

and have the Foos persist in a table like this:

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

UPDATE:

I know how to map other entities, but it's overkill in many cases. It looks like what I'm suggesting isn't possible without creating yet another entity or ending up with everything in some blob column.

like image 478
danb Avatar asked Apr 28 '09 05:04

danb


3 Answers

Here is how you would do this if you are using 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;
 }

For a clearer example see section 2.2.5.3.3 in the Hibernate Annotations Reference Guide.

like image 183
Max Z Avatar answered Oct 14 '22 21:10

Max Z


This is in Hibernate terms a "collection of values" or "elements". There is a (Hibernate specific) annotation for it. JPA does not support this (yet).

In short, annotate your collection like this:

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

This will create the necessary table with foreign keys and restrictions.

like image 40
Maarten Winkels Avatar answered Oct 14 '22 21:10

Maarten Winkels


If you store your list as an array, it works:

setFoos(String[] foos);

you can transform it like this:

setFoos(myList.toArray(new String[myList.size()]));
like image 4
Renaud Avatar answered Oct 14 '22 22:10

Renaud