当前位置: 首页 > 知识库问答 >
问题:

Spring数据映射不按预期工作

巫马磊
2023-03-14

我有一个具有两个外键和多对一关联(到表、检查点和设置)的表选项:db Schema。

@Entity
@Table(name = "checkpoint")
@AllArgsConstructor
@NoArgsConstructor
@Data
html" target="_blank">public class Checkpoint {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  private long location;

  @OneToMany(mappedBy = "checkpoint",
        cascade = CascadeType.ALL,
        orphanRemoval = true,
        fetch = FetchType.EAGER)
  private List<RewardOption> rewardOptions = new ArrayList<>();
}

@Entity
@Table(name = "setting")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class RewardSetting {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Column(name = "base_line")
  private long baseLine;

  @OneToMany(mappedBy = "rewardSetting",
        cascade = CascadeType.REMOVE,
        orphanRemoval = true)
  private List<RewardOption> rewardOptions = new ArrayList<>();
}

@Entity
@Table(name = "option")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class RewardOption {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  private long weight;

  @ManyToOne
  @JoinColumn(name = "setting_id")
  private RewardSetting rewardSetting;

  @ManyToOne
  @JoinColumn(name = "checkpoint_id")
  private Checkpoint checkpoint;
} 
...
rewardSettingRepository.delete(rewardSetting);
...
rewardSettingRepository.delete(id);

完整堆栈跟踪是:

org.springframework.dao.DataIntegrityViolationException:不能执行语句;SQL[N/A];约束[null];嵌套异常是org.hibernate.exception.constraintViolationException:在org.springframework.orm.jpa.vendor.hibernatejpaction.converthibernateAccessException(Hibernatejpaction.java:278)在org.springframework.orm.jpa.vendor.hibernatejpaction.java.translateExceptionIfprobley(Hibernatejpaction.java:244)在manager.java:765)在org.springframework.transaction.support.AbstractPlatformTransactionManager.Commit(AbstractPlatformTransactionManager.java:734)在org.springframework.transaction.interceptor.transaction.Transaction.Transaction.Transaction.Transaction.Transaction.TransactionSupport.CommittTransactionAfterRetting(interceptor.transactioninterceptor.invoke(transactioninterceptor.java:96)在org.springframework.aop.framework.reflectiveMethodInvocation.proce(reflectiveMethodInvocation.java:179)在org.springframework.dao.support.persistenceExceptionTranslationInterceptor.invoke在(CrudMethodMetadatapostProcessor.java:133)在org.springframework.aop.framework.reflectiveMethodInvocation.java:179)在org.springframework.aop.interceptor.exposeInvocation.invokor.invoke(exposeInvocation.java:92)在org.springframework.aop.framework.refository.core.support.surrou在ndingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)在org.springframework.aop.framework.ReflectiveMethodInvocation.proce(ReflectiveMethodInvocation.java:179)在UB.star67.hibernateFetchCascade.hibernateFetchCascadeApplication.main(HibernateFetchCascadeApplication.java:36)

由:org.hibernate.exception.constraintViolationException:在org.hibernate.exception.internal.sqlExceptionTypeDelegate.convert(sqlExceptionTelegate.java:59)在org.hibernate.exception.internal.standardsqlExceptionConverter.convert(StandardsqlExceptionConverter.java:42)在org.hibernate.engine.jdbc.spi.sqlExceptionConvert ResultsetReturnImpl.java:207)在org.hibernate.engine.jdbc.batch.internal.nonbatchingBatch.addTobatch(nonbatchingBatch.java:45)在org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.delete)在org.hibernate.persister.entity.AbstractEntityPersister.delete(i.actionQueue.executeAction(actionQueue.java:582)在org.hibernate.engine.spi.actionQueue.executeAction(actionQueue.java:456)在org.hibernate.event.internal.abstractFlushingEventListener.performExecutions(abstractFlushEventListener.java:337)在org.hibernate.event.internal.defaultFlushEventListener.onflush在org.hibernate.internal.sessionimpl.beforeTransactionCompletis(sessionimpl.java:2963)在org.hibernate.engine.jdbc.internal.jdbc.internal.jdbc.c.internal.jdbcCoordinatorimpl.beforeTransactionCompletis(sessionimpl.java:2339)在nsaction.backend.jdbc.internal.jdbcResourceLocalTransactionCoordinatorImpl.Access$100(jdbcResourceLocalTransactionCoordinatorImpl.java:38)在org.hibernate.resource.transaction.backend.jdbc.internal.jdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlimpl.Commit pa.jpatransactionManager.doCommit(jpatransactionManager.java:517)...18多

由:java.sql.sqlintegrityConstraintViolationException:无法删除或更新父行:外键约束失败(演示.选项,约束fkdhs5wopt13o6b9gl4wydr0l9o外键(setting_id)引用设置(id))在.mysql.cj.jdbc.exceptions.sqlexceptionsmapping.translateExceptionsmapping.java:122)在com.mysql.cj.jdbc.clientPreparedStatement.executeInternal(ClientPreparedStatement.java:960)在com.mysql.cj.jdbc.clientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1116)在1396)在com.mysql.cj.jdbc.clientpreparedStatement.executeUpdate(ClientPreparedStatement.java:1051)在sun.reflect.nativeMethodAccessorImpl.invoke0(原生方法)在sun.reflect.nativeMethodAccessorImpl.invoke(nativeMethodAccessorImpl.invoke(nativeMethodAccessorImpl.java:62)在sun.reflect.delegatingMethodAccessorImpl.invoke(delegatingMethodAccessorImpl.java hibernate.engine.jdbc.internal.ResultSetReturnImpl.ExecuteUpdate(resultSetReturnImpl.java:204)...37多

而且,在玩了一圈之后,我发现了一些奇怪的事情,我无法解释:

  1. 在类RewardOption中为检查点添加@manytoone(fetch=FetchType.lazy)可以解决这个问题,但是fetch类型如何影响级联?
  2. 在类检查点中更改cascade=cascadetype.all to cascade=cascadetype.remove可以解决这个问题,但是我需要保存cascade...

如果有人能对这些“修复”有所了解,那就太好了。

以下是可供使用的代码

共有1个答案

东方旺
2023-03-14

要使其工作,您需要同步双向关联的两端。

这意味着,在调用delete之前,您需要确保将父实体与al子实体分离。

 类似资料:
  • 问题内容: 具有以下映射: 如果我添加以下代码,即使它与映射不匹配(丢失)也可以完美地工作,但ES不会抱怨。 如果我添加以下条目,它也可以工作。 似乎该映射未对我添加的元素生效。尝试映射类型时我做错了什么? 问题答案: 这是Elasticsearch的默认行为,在大多数情况下是理想的。但是对于您的情况,如果您不想允许索引未在映射中定义的字段,则需要更新映射并将其属性设置为。基本上,您的映射定义应如

  • 我正在使用Dozer在Document类和DocumentManagementBean类之间进行映射,这都是我自己制作的。两者都有一个Joda DateTime类型的属性,即getter和setter,名为dateAdded。 当文档对象d的属性dateAdded=x时,调用映射器。map(d,DocumentManagementBean.class)所有字段都会正确地自动映射(因为我完全控制代码

  • 我已经创建了一个通用的Spring批处理作业,用于处理数据并存储到CSV中。我需要从读取器传递到写入器的一些数据,这是我试图使用JobExecution来做的。然而令人惊讶的是,代码似乎首先调用getWriter()而不是getReader()函数。下面给出了我的配置。有人能解释为什么会发生这种情况,以及是否有其他方法将数据从读取器传递到写入器。 我想从读取器传递到写入器的数据是CSV的列名。由于

  • 问题内容: 我已经为此奋斗了2天,尽我所能用Google搜索和stackoverflow,但是我无法解决。 我正在构建一个简单的节点应用程序(+ Express + Mongoose),其登录页面重定向到主页。这是我的服务器JS代码: 登录页面向发出POST请求,在此验证发布的数据。这可行。我可以在Node控制台中看到“我们在这里:’/ credentials’”。 然后是问题:res.redir

  • 为什么我的搜索函数永远不会执行“else”(如果没有找到结果,else应该回显文本)?我在尝试显示所有结果时也遇到了一些问题(没有选择搜索标准,只需按搜索按钮)。我将上传页面的全部代码,因为我不知道您是否也需要HTML部分来解决问题。我知道这是一个很大的代码块,但如果可以的话,请帮忙。谢谢 以下是我的代码链接:http://pastebin.com/BXe1C0dr

  • 基于文档,@EnableSideCar注释充当希望在Eureka中注册的非JVM应用程序的代理。相应地,要设置的配置为: 一旦“sidecar”启动并运行,我们应该能够通过service registry调用一个非JVMendpoint,只需使用“sidecar”应用程序在Eureka中注册的名称。例如,如果我们的“sidecar”应用程序在Eureka中注册为“php-sidecar”,以代理带