使用JPA / Hibernate注释映射字符串列表

时间:2009-04-28 05:33:04

标签: java hibernate jpa annotations

我想做这样的事情:

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

并将Foos坚持在这样的表格中:

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

更新:

我知道如何映射其他实体,但在许多情况下它过度杀伤。如果没有创建另一个实体或最终在某些blob列中的所有内容,看起来我建议的是不可能的。

6 个答案:

答案 0 :(得分:28)

如果您使用的是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;
 }

有关更清晰的示例,请参阅the Hibernate Annotations Reference Guide中的第2.2.5.3.3节。

答案 1 :(得分:27)

这是Hibernate terms一个“值集合”或“元素”。它有一个(特定于Hibernate)注释。 JPA不支持(尚未)。

简而言之,就像这样注释你的收藏:

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

这将创建具有外键和限制的必要表。

答案 2 :(得分:4)

如果将列表存储为数组,则可以:

setFoos(String[] foos);

你可以像这样改变它:

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

答案 3 :(得分:0)

创建一个实体'FooBars'

将属性'Foods'重构为

@OneToMany 列出Foos

答案 4 :(得分:0)

我认为这就是你所需要的:

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

答案 5 :(得分:0)

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;
    }

在数据库中,bar_id是foo_bars表中的外键