【问题标题】:deleting Child and Parent Entities on Spring MVC makes ConstraintViolationException在 Spring MVC 上删除子实体和父实体会导致 ConstraintViolationException
【发布时间】:2015-01-15 17:28:21
【问题描述】:

我在 Spring MVC 服务器中有 2 个 JPA 实体。其中一个是“父母”,另一个是孩子。 当我读到here(原因4)时,当我有一个父实体和子实体时,首先必须删除父实体,然后再删除子实体。它正在制作 org.hibernate.exception.ConstraintViolationException

父实体项目

@Entity
public class Project {  
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@JsonIgnore
private long id;
private String project_name;
private Date date;
private String nome_classe;
@ElementCollection(fetch=FetchType.EAGER)
List<respostas> Listarespostas = new ArrayList<respostas>(); //CHILD !!!!
public Project()
{}
//gets and sets
}

子实体回复

@Entity
public class respostas {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@JsonIgnore
private long id;
@ElementCollection(fetch=FetchType.EAGER)
List<String> lista = new ArrayList<String>();
String respostasjson;
public respostas()
{}
public respostas(List<String> lista)
{
    this.lista = lista;
    Gson gson = new Gson();
    gson.toJson(lista);
}
public void addResposta(String resposta)
{
    lista.add(resposta);
}
public void removeResposta(int i)
{
    lista.remove(i);
}
public String getRespostasjson() {
    return respostasjson;
}
public void setRespostasjson(String respostasjson) {
    this.respostasjson = respostasjson;
}
public List<String> getLista() {
    return lista;
}
}

我尝试在 Controller

中的“@RequestMapping(value = "delete")”中删除它们
 @RequestMapping(value = "delete", method = RequestMethod.GET)
public ModelAndView DeletePostoSaude(Principal p,HttpServletResponse response) 
{
    if(p.getName().equals("coursera"))
    {
        Projects.deleteAll();
        respostas.deleteAll();
    }
}

ConstraintViolationException 仍然出现:

休眠:从项目 project0_ 中选择 project0_.id 作为 id1_5_、project0_.date 作为 date2_5_、project0_.listaperguntasjson 作为 listaper3_5_、project0_.listarespostasjson 作为 listares4_5_、project0_.nome_classe 作为 nome_cla5_5_、project0_.project_name 作为 project_6_5_ 休眠:从 Project_Listaperguntas 中删除 Project_id=? 休眠:从项目中删除 id=? 2014-11-18 10:29:26.599 WARN 980 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:23503,SQLState:23503 2014-11-18 10:29:26.599 错误 980 --- [nio-8080-exec-2] ohengine.jdbc.spi.SqlExceptionHelper: Violación de una restrictción de Integridad Reference: "FK_547Q6QW5LUAR2Q292SPD53J5G: PUBLIC.PROJECT_LISTARESPOSTAS FOREIGN KEY PROJECT_ID) 参考 PUBLIC.PROJECT(ID) (193)" 参照完整性约束违规:“FK_547Q6QW5LUAR2Q292SPD53J5G:PUBLIC.PROJECT_LISTARESPOSTAS FOREIGN KEY(PROJECT_ID) REFERENCES PUBLIC.PROJECT(ID) (193)”; SQL 语句: 从 id=? 的项目中删除[23503-175] 2014-11-18 10:29:26.599 INFO 980 --- [nio-8080-exec-2] o.h.e.j.b.internal.AbstractBatchImpl:HHH000010:在批处理发布时,它仍然包含 JDBC 语句 2014-11-18 10:29:26.601 错误 980 --- [nio-8080-exec-2] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于 servlet [dispatcherServlet] path [] 抛出异常 [请求处理失败;嵌套异常是 org.springframework.dao.DataIntegrityViolationException:无法执行语句; SQL [不适用];约束 ["FK_547Q6QW5LUAR2Q292SPD53J5G: PUBLIC.PROJECT_LISTARESPOSTAS FOREIGN KEY(PROJECT_ID) REFERENCES PUBLIC.PROJECT(ID) (193)"; SQL 语句: 从 id=? 的项目中删除[23503-175]];嵌套异常是 org.hibernate.exception.ConstraintViolationException: could not execute statement] 根本原因 org.h2.jdbc.JdbcSQLException: Violación de una restrictción de Integridad Reference: "FK_547Q6QW5LUAR2Q292SPD53J5G: PUBLIC.PROJECT_LISTARESPOSTAS FOREIGN KEY(PROJECT_ID) REFERENCES PUBLIC.PROJECT(ID) (193)" 参照完整性约束违规:“FK_547Q6QW5LUAR2Q292SPD53J5G:PUBLIC.PROJECT_LISTARESPOSTAS FOREIGN KEY(PROJECT_ID) REFERENCES PUBLIC.PROJECT(ID) (193)”; SQL 语句: 从 id=? 的项目中删除[23503-175]

有什么解决办法吗? (每个实体都有自己的 CrudRepository)

【问题讨论】:

    标签: spring hibernate jpa entity


    【解决方案1】:

    从错误来看,您的表格似乎是相反的。我看到一个 PROJECT_LISTARESPOSTAS 引用该项目。尝试以相反的顺序删除:

    respostas.deleteAll();
    Projects.deleteAll();
    

    您可能还想检查删除级联选项,以便在删除实体时也删除引用实体。这可以像在引用另一个表的列上添加注释 @OnDelete(action = OnDeleteAction.CASCADE) 一样简单(查看 spring jpa 文档以获取更多信息)

    【讨论】:

    • 我尝试了几种试探性方法,它们都给出了相同的错误(问题中的上述错误),包括您建议的删除顺序。如果我将@OnDelete(action = OnDeleteAction.CASCADE) 放在@ElementCollection(fetch=FetchType.EAGER) List&lt;respostas&gt; Listarespostas = new ArrayList&lt;respostas&gt;();(儿童)上,则会出现以下错误。我试图将其放在“respostas 实体(儿童,它没有纠正任何东西)”的顶部。 > 使用者:org.hibernate.MappingException:只有反向一对多关联可以使用 on-delete="cascade":palmaslab.mapas.repository.Project.Listarespostas
    • 问题是我用另一个 ID 创建了这个ListaRespostas。解决方案是删除数据库并将您的删除顺序放入我的代码中。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2017-10-31
    • 2021-04-04
    相关资源
    最近更新 更多