21

我想做这样的事情:

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

并让 Foos 保存在这样的表中:

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

更新:

我知道如何映射其他实体,但在很多情况下它是矫枉过正的。如果不创建另一个实体或以某个 blob 列中的所有内容结束,我的建议似乎是不可能的。

4

6 回答 6

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

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

于 2012-01-02T03:00:31.977 回答
27

这在Hibernate 术语中是“值的集合”或“元素”。它有一个(Hibernate 特定的)注释。JPA 不支持这个(还)。

简而言之,像这样注释您的集合:

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

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

于 2009-06-06T18:15:27.807 回答
4

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

setFoos(String[] foos);

你可以像这样转换它:

setFoos(myList.toArray(new String[myList.size()]));
于 2009-11-16T16:49:18.313 回答
0

创建一个实体“FooBars”

将属性“Foos”重构为

@OneToMany 列出 Foos

于 2009-04-28T06:35:04.463 回答
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;
}
于 2009-04-28T13:10:48.613 回答
0

这里'Foos'是字符串列表,所以它是单向的。我们可以使用@ElementCollection 注解在一个模型类中做到这一点。

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

在 DB bar_id 是 foo_bars 表中的外键

于 2019-02-24T14:58:55.160 回答