持久化JPA对象

时间:2015-12-11 03:10:51

标签: java spring hibernate jpa

我创建了一个实体类,并在ID字段上添加了注释@id@GeneratedValue。在持久化对象时,我想知道它会自动在ID字段中设置值,但是当将数据提交到db时,我得到了序列异常。然后我设置了ID并坚持它将成功提交。

我再次运行了我的代码并尝试使用相同的值来保存数据,并且我得到了与重复有关的异常..

我搜索并更改了我的@GeneratedValue注释,其中包含以下内容:

@SequenceGenerator(name= "seq",sequenceName="seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq")

,数据保持成功,无需手动设置ID值。

所以我的问题是@GeneratedValue@SequenceGenerator之间的差异是不是这两个注释用于同一目的?我们如何在属性中使用策略?

请指导我。帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

我发现this可能会对您有所帮助。 来自SequenceGenerator的Javadoc

  

定义在为GeneratedValue批注指定生成元素时可以通过名称引用的主键生成器。可以在实体类或主键字段或属性上指定序列生成器。生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)。

答案 1 :(得分:0)

我将尽力覆盖你的两个问题。

@SequenceGenerator用于指向您在数据库中使用“ sequenceName ”属性创建的序列,然后使用“”为其指定名称name '属性。例如:

 @SequenceGenerator( name="myIdSeq", sequenceName="MY_ID_SEQ", allocationSize=1, initialValue=1 )
 @GeneratedValue( strategy=GenerationType.SEQUENCE, generator="myIdSeq" )

请注意,name可以在您的持久性单元中共享。

@GeneratedValue定义了您希望生成ID的策略,通常我们有像

这样的状态

1. IDENTITY(自动)会自动增加并在MySQL中流行

2. SEQUENCE 指向序列Gernerator并且是您在上面使用的序列。请注意,generator值应与@ name

中的SequenceGenerator值相匹配

3. TABLE ,它使用专用表来存储序列名称以及用于运行数字的列,适用于企业级应用程序。