Hibernate生成的主键的约束违例,并通过脚本

时间:2018-06-14 07:39:53

标签: spring postgresql hibernate

我有一个场景,我正在执行一些数据库(PostgreSQL)操作。

使用shell脚本在表中插入一些预定义的条目,我在其中提供 assoc_id ,这也是一个NOT NULL约束和主键。对于相同的操作,用户可以使用UI输入值,使用休眠序列自动生成assoc_id。

现在情节让我们说通过shell脚本的预定义条目如下:

INSERT INTO config.profile_backend_point_asso(assoc_id,enabled,end_point_id,profile_id) VALUES
(1,true,1,1),
(2,true,2,1),
(3,true,3,1),
(4,true,4,1),
(5,true,5,1),
(6,true,6,1),
(7,true,7,1),
(8,true,8,1),
(9,true,9,1),
(10,true,10,1);

现在通过UI用户插入一些条目,并且可能存在hibernate在最后一次通过shell脚本插入后生成 assoc_id 为11的情况。

现在让我们说需要通过shell脚本插入更多预定义的数据,在这种情况下,我们可能不知道同一个表的最后一个hibernate序列生成,并且通过脚本插入的新条目是如下:- INSERT INTO config.profile_backend_point_asso(assoc_id,enabled,end_point_id,profile_id)VALUES (11,真实,11,1), (12,真实,12,1), (13,假,13,1), (14,真实,14,1), (15,真实,15,1);

在这种情况下,不会插入数据到脚本,因为已经存在使用UI插入的 assoc_id 11。

现在我如何同步脚本和UI条目,以便不会出现这种情况?

注意:UI代码由Java代码支持,用于自动生成 assoc_id ,如下所示:

    @Id
    @SequenceGenerator(name = "hibernate_sequence", sequenceName = 
        "hibernate_sequence" , allocationSize=50)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
        "hibernate_sequence")
    @Column(name = "assoc_id")
    private long assocId;

如果操作是通过UI执行的,那么java代码会给出以下异常:

  

org.springframework.dao.DataIntegrityViolationException:一个不同的   具有相同标识符值的对象已与该关联   会话:[com.cavisson.model.ProfileBackendPointAssociation#50];   嵌套异常是javax.persistence.EntityExistsException:A   具有相同标识符值的不同对象已经关联   与会议:   [com.cavisson.model.ProfileBackendPointAssociation#50]           在org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:410)

另外,hibernate_sequence正在为数据库中的所有表生成id,这只是一个这样的例子。

请帮助我解决此问题的解决方法或想法。

1 个答案:

答案 0 :(得分:0)

使用序列时,如评论所述,这是一个数据库问题。您不应在插入时提供ID,因为它将在DB上提供。不应在insert语句中使用assoc_id。