有时我会一起找到它们,有时是一个人……其他时候它们似乎也一样。

有什么不同?

这是三个例子。他们有什么不同?为什么我不能只对所有它们使用@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注释的列的值。批注上的元素strategygenerator描述了如何获取生成的值。
strategy批注中的@GeneratedValue元素有四个可能的值:IDENTITYAUTOTABLESEQUENCESee more

因此,为了回答您的问题的第2部分,代码段指示userId的值将通过数据库中的序列获得。
generator批注的@GeneratedValue元素表示主键生成器的名称。在问题的第1部分中,代码段指示将使用名为generatorincrement来获取主键值。然后在下一个注释increment中定义@GenericGenerator@GenericGenerator是一个 hibernate 注释,用于表示自定义生成器,它可以是Hibernate提供的生成器的类或快捷方式。 increment是Hibernate生成器的快捷方式,它可以:



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

10-05 19:07