Java Spring JPA数据保存实体唯一索引(两列,非pk)违反了cann';t抛出异常

Java Spring JPA数据保存实体唯一索引(两列,非pk)违反了cann';t抛出异常,java,spring,spring-data-jpa,unique-constraint,Java,Spring,Spring Data Jpa,Unique Constraint,我的java代码如下所示: public class Monitorlog{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) int id;//pk String sn; // unique constraints(sn,checkpoint) String checkpoint; } public interface MonitorlogDao extends JpaRepository&

我的java代码如下所示:

public class Monitorlog{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    int id;//pk 
    String sn; //  unique constraints(sn,checkpoint)
    String checkpoint;
}

public interface MonitorlogDao extends JpaRepository<Monitorlog, Integer>{}

@Service
public class MonitorlogService{
    @Autowired
    MonitorlogDao monitorlogDao;
    public MonitorlogDao getMonitorlog(){
        return monitorlogDao;
    }
}
    public void testMonitorlogSerivce(){
        Monitorlog m = new Monitorlog();
        m.setSn("aa");
        m.setCheckpoint("bb");
        monitorlogService.getMonitorlogDao().save(m);
        m = new Monitorlog();
        m.setSn("aa");
        m.setCheckpoint("bb");
        // SQL insert failed here
        try{
            monitorlogService.getMonitorlogDao().save(m);
        }catch(Exception e){
            log("",e);
        }
    }
secode保存(m)失败,它希望引发异常,但不希望。 m.getId()是0,但没有捕获异常,为什么? 我使用sprint引导版本2.0.0M。 唯一索引

CREATE UNIQUE INDEX [IND_IDNO_POSITIONKIND_CHECKPOINT_1] ON 
[dbo].[MONITORLOG] ([CHECKPOINT] DESC, [SN] ASC) 
WITH (IGNORE_DUP_KEY = ON)

您在第二次保存时提供的数据违反了DB的PK和/或英国规则


您必须始终提供符合PK和/或UK(唯一密钥)规则的有效数据,以便在DB中保存代码

您在第二次保存时提供的数据违反了DB的PK和/或UK规则


您必须始终提供符合PK和/或UK(唯一密钥)规则的有效数据,以便在DB中保存代码

调用save()方法的可能副本应该在捕获异常的事务中。如果我像这样进行测试
m.setId(1)
,并且db有一条记录,那么id是1。
monitorlogService.getMonitorlogDao().save(m)将抛出SQLServerException唯一约束!我猜是sql jdbc驱动程序的问题。我明天会检查它。我用mssql jdbc 6.2.1.jre8测试它,结果是一样的。它不同于,这就是为什么由PK引起的,但我的问题是由唯一的不可解释的重复调用save()方法引起的。如果我这样做
m.setId(1)
,数据库有一条记录,id为1。
monitorlogService.getMonitorlogDao().save(m)将抛出SQLServerException唯一约束!我猜是sql jdbc驱动程序的问题。我明天会检查它。我用mssql jdbc 6.2.1.jre8测试它,结果是一样的。它不同于,这就是为什么由PK引起的,但我的问题是由唯一索引约束引起的,比如:
在[dbo].[MONITORLOG]([CHECKPOINT]DESC,[SN]上创建唯一索引[IND\u IDNO\u POSITIONKIND\u CHECKPOINT\u]ASC)具有(忽略重复键=打开)
这样的唯一约束:
在[dbo].[MONITORLOG]([CHECKPOINT]DESC,[SN]ASC上创建唯一索引[IND\u-IDNO\u-POSITIONKIND\u-CHECKPOINT\u-1],(忽略重复键=打开)