Java Spring JPA数据保存实体唯一索引(两列,非pk)违反了cann';t抛出异常
我的java代码如下所示: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&
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],(忽略重复键=打开)