有时我会一起找到它们,有时是一个人……其他时候它们似乎也一样。
有什么不同?
这是三个例子。他们有什么不同?为什么我不能只对所有它们使用@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
。 See more。
因此,为了回答您的问题的第2部分,代码段指示userId
的值将通过数据库中的序列获得。generator
批注的@GeneratedValue
元素表示主键生成器的名称。在问题的第1部分中,代码段指示将使用名为generator
的increment
来获取主键值。然后在下一个注释increment
中定义@GenericGenerator
。 @GenericGenerator
是一个 hibernate 注释,用于表示自定义生成器,它可以是Hibernate提供的生成器的类或快捷方式。 increment
是Hibernate生成器的快捷方式,它可以:
在您的问题的第三部分中,代码使用hilo
Hibernate生成器,该生成器: