我创建了一个实体类,并在ID字段上添加了注释@id
和@GeneratedValue
。在持久化对象时,我想知道它会自动在ID字段中设置值,但是当将数据提交到db时,我得到了序列异常。然后我设置了ID并坚持它将成功提交。
我再次运行了我的代码并尝试使用相同的值来保存数据,并且我得到了与重复有关的异常..
我搜索并更改了我的@GeneratedValue
注释,其中包含以下内容:
@SequenceGenerator(name= "seq",sequenceName="seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq")
,数据保持成功,无需手动设置ID值。
所以我的问题是@GeneratedValue
和@SequenceGenerator
之间的差异是不是这两个注释用于同一目的?我们如何在属性中使用策略?
请指导我。帮助将不胜感激
答案 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 ,它使用专用表来存储序列名称以及用于运行数字的列,适用于企业级应用程序。