java – @GeneratedValue和@GenericGenerator之间的区别

有时我会找到他们在一起,有时独自一人…其他时候,他们似乎也这样做。

有什么不同?

这里有三个例子。他们做了什么不同?为什么我不能只使用@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注释的列的值。注释上的元素策略和生成器描述如何获取生成的值。

@GeneratedValue注释上的策略元素有四个可能的值:IDENTITY,AUTO,TABLE和SEQUENCE。 See more

所以要回答你的问题的第2部分,代码片段指示userId的值将通过数据库中的序列获取。

@GeneratedValue注释的generator元素表示主键生成器的名称。在您的问题的第1部分中,代码段指示名为increment的生成器将用于获取主键值。然后在下一个注释@GenericGenerator中定义增量。 @GenericGenerator是一个用于表示自定义生成器的hibernate注解,可以是Hibernate提供的生成器的类或快捷方式。增量是Hibernate生成器的快捷方式:

generates identifiers of type long, short or int that are unique only
when no other process is inserting data into the same table. Do not
use in a cluster.

在您的问题的第三部分,代码使用一个hilo Hibernate生成器:

uses a hi/lo algorithm to efficiently generate identifiers of type
long, short or int, given a table and column (by default
hibernate_unique_key and next_hi respectively) as a source of hi
values. The hi/lo algorithm generates identifiers that are unique only
for a particular database.

http://stackoverflow.com/questions/18205574/difference-between-generatedvalue-and-genericgenerator

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – @GeneratedValue和@GenericGenerator之间的区别