java – 无法执行语句; SQL [不适用];约束[null];
发布时间:2020-12-15 02:16:32 所属栏目:Java 来源:网络整理
导读:我从特定架构中删除一行时收到此错误: Hibernate: select journal0_.id as id1_2_0_,journal0_.content as content2_2_0_,journal0_.filename as filename3_2_0_,journal0_.subject as subject4_2_0_,journal0_.tags as tags5_2_0_,journal0_.user_id as us
我从特定架构中删除一行时收到此错误:
Hibernate: select journal0_.id as id1_2_0_,journal0_.content as content2_2_0_,journal0_.filename as filename3_2_0_,journal0_.subject as subject4_2_0_,journal0_.tags as tags5_2_0_,journal0_.user_id as user_id6_2_0_,journal0_.version as version7_2_0_ from journal journal0_ where journal0_.id=? Hibernate: select nextval ('hibernate_sequence') Hibernate: insert into subscription (journal_id,user_id,version,id) values (?,?,?) 2016-09-03 01:08:01.581 WARN 13462 --- [nio-8080-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23505,SQLState: 23505 2016-09-03 01:08:01.581 ERROR 13462 --- [nio-8080-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper : Unique index or primary key violation: "UK_9XFQUT5UKXNSBX8NL2LR23TC5_INDEX_9 ON PUBLIC.SUBSCRIPTION(USER_ID,JOURNAL_ID) VALUES (9,2,10)"; SQL statement: insert into subscription (journal_id,?) [23505-191] 2016-09-03 01:08:01.598 INFO 13462 --- [nio-8080-exec-9] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements 2016-09-03 01:08:01.632 ERROR 13462 --- [nio-8080-exec-9] c.j.exceptions.ErrorController : Exception during execution of SpringSecurity application org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 即使调用带有正确参数的delete方法,它仍在运行插入查询,这会导致数据冲突问题. 这是模型: @Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"userId","journalId"})}) public class Subscription { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Version private Integer version; private Integer userId; private Integer journalId; public void setId(Integer id) { this.id = id; } public Integer getId() { return this.id; } public void setVersion(Integer version) { this.version = version; } public Integer getVersion() { return this.version; } public void setUserId(Integer userId) { this.userId = userId; } public Integer getUserId() { return this.userId; } public void setJournalId(Integer journalId) { this.journalId = journalId; } public Integer getJournalId() { return this.journalId; } } 这是调用delete方法的地方: @Override public void unsubscribeJournalForSubscriber(Journal journal,Account subscriber) { Subscription subscription = new Subscription(); subscription.setJournalId(journal.getId()); subscription.setUserId(subscriber.getId()); this.subscriptionRepository.delete(subscription); } 解决方法
要删除Subscription实体,您只需要设置实体的主键,即Subscription Entity的id字段.但是,您正在设置journalId和userId字段并尝试删除.
您应该只设置Subscription实体的id字段,它将被删除. 更新: 您的存储库代码应该是 public interface SubscriptionRepository extends CrudRepository<Subscription,Integer> { /** * Returns array of Subscribed journals by specific user's id * * @param userId * @return */ ArrayList<Subscription> findByUserId(Integer userId); List<Subscription> findByUserIdAndJournalId(Integer userId,Integer journalId); } 现在您的业务loginc代码将是: @Override public void unsubscribeJournalForSubscriber(Journal journal,Account subscriber) { List<Subscription> list = subscriptionRepository.findByUserIdAndJournalId(subscriber.getId(),journal.getId()); for(Subscription subscription : list){ subscriptionRepository.delete(subscription); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |