我想做这样的事情:
@Entity public class Bar {
@Id @GeneratedValue long id;
List<String> Foos
}
并将Foos坚持在这样的表格中:
foo_bars (
bar_id int,
foo varchar(64)
);
更新:
我知道如何映射其他实体,但在许多情况下它是过度的。如果没有创建另一个实体或者在某个blob列中结束所有内容,看起来我建议的是不可能的。
这是在Hibernate terms的“价值集合”或“元素”。它有一个(特定于Hibernate)注释。 JPA不支持(尚未)。
简而言之,像这样注释你的收藏:
@CollectionOfElements
@JoinTable(
table=@Table(name="..."),
joinColumns = @JoinColumn(name="...") // References parent
)
@Column(name="...value...", nullable=false)
这将创建具有外键和限制的必要表。
如果您使用的是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节。
如果将列表存储为数组,则可以:
setFoos(String[] foos);
你可以这样改变它:
setFoos(myList.toArray(new String[myList.size()]));
创建一个实体'FooBars'
将attribut'Foos'重构为
@OneToMany列表Foos
我认为这就是你需要的:
@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;
}
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;
}
在DB中,bar_id是foo_bars表中的外键