有时我发现他们在一起,有时单独……有时他们似乎也做同样的事情。
有什么不同?
下面是三个例子。他们有什么不同?为什么我不能对所有这些只使用 @GeneratedValue?
示例 1
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
Long id;
示例 2
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
private int userId;
示例 3
@ElementCollection
@JoinTable(name="Address",
joinColumns=@JoinColumn(name="user_id")
)
@GenericGenerator(name="hilo-gen", strategy="hilo")
@CollectionId(columns = @Column(name="Address_id"), generator = "hilo-gen", type = @Type(type="long"))
Collection<Addr> listOfAddresses = new ArrayList<Addr>();
使用ORM 时,通常需要生成主键值。
的
@GeneratedValue
注释表示一个列中的值,必须以进行注释@Id
被生成。注释上的元素strategy
和generator
描述了如何获得生成的值。有四个可能的值
strategy
的元素@GeneratedValue
注释:IDENTITY
,AUTO
,TABLE
和SEQUENCE
。 查看更多。因此,要回答问题的第 2 部分,代码片段表明
userId
将通过数据库中的序列获取的值。注释的
generator
元素@GeneratedValue
表示主键生成器的名称。在您问题的第 1部分中,代码片段表明将使用generator
命名increment
来获取主键值。increment
然后在下一个注释中定义@GenericGenerator
。@GenericGenerator
是用于表示自定义生成器的 hibernate 注释,它可以是 Hibernate 提供的生成器的类或快捷方式。increment
是 Hibernate 生成器的快捷方式:在问题的第三部分中,代码使用了一个
hilo
Hibernate 生成器: