2011-11-09 42 views
0

我有这样的关系。有一个Car表和CarGroup表。汽车组表可容纳汽车。我想要的是:当一辆汽车被拆除时,如果它在一个汽车组内,它应该像往常一样从那里拆除。我在我的项目中使用Spring和Hibernate(我有一个PostgreSQL数据库)。当我想删除一个车,我得到这个错误:Hibernate的DataIntegrityViolationException异常的外键违反不允许删除

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not delete: [com.aaa.bbb.ccc.Car#2]; SQL [delete from Car where a_id=? and st=?]; constraint [fkbc80f56cb1ece7b8]; nested exception is org.hibernate.exception.ConstraintViolationException: could not delete: [com.aaa.bbb.ccc.Car#2] 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656) 
    org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:582) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:112) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 

我甚至无法从pgAdmin的(PostgreSQL的控制台)删除车像往常一样。当我写的是:

delete from Car where a_id=2 and st=2; 

错误,我得到如下:从我CarGroup

ERROR: update or delete on table "car" violates foreign key constraint "fkac80f56cb1ece7b8" on table "cargroup_car" 
DETAIL: Key (a_id)=(2) is still referenced from table "cargroup_car". 

********** Error ********** 

ERROR: update or delete on table "car" violates foreign key constraint "fkac80f56cb1ece7b8" on table "cargroup_car" 
SQL state: 23503 
Detail: Key (a_id)=(2) is still referenced from table "cargroup_car". 

部分代码:

@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.EAGER) 
    @JoinTable(name = "cargroup_car", joinColumns = @JoinColumn(name = "ADID"), inverseJoinColumns = @JoinColumn(name = "AID")) 
    private Set<Car> cars; 

编辑:我想:当我删除一辆车,我想要它被删除,即使它是在汽车组下。我不想删除汽车组以删除汽车。如何更改Java端数据库设置(Cascade类型或将多对多更改为多对一和多对多等)来执行此操作?

PS:我没有写Java端代码。如果你解释它,你是受欢迎的。

回答

1

您不能删除汽车,因为cargroup_car表中的一行有引用。因此,在删除汽车之前,您需要删除cargroup_car行。

+0

感谢。我的问题是如何配置Java端来完成它。我的意思是没有必要删除汽车组来删除汽车。我能做些什么与关系写在汽车变量定义的顶部? – kamaci

+0

你是什么意思?你必须删除车组。你的数据库就是这样设置的。 – hvgotcodes

+0

@jb对,我认为汽车组是连接表的原因... – hvgotcodes

0

只是一个猜测:尝试添加CascadeType.REMOVE

@ManyToMany(cascade = 
    {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, 
    fetch = FetchType.EAGER) 

或者存在其他选择:你可以改变数据库中的级联外键约束从车上删除操作cargroup,尽管它可能是危险的这样做,这取决于您的业务逻辑。

+0

谢谢,但当我使用'CascadeType.REMOVE'时,我仍然得到相同的错误。 – kamaci

1

你需要确保没有CarGroups有你想在其设置的汽车删除汽车:

public void deleteCar(Car car) { 
    for (CarGroup group : car.getCarGroups()) { 
     group.getCars().remove(car); 
    } 
    session.delete(car); 
} 
+0

感谢您的回答。但是,如果我更改Cascade类型或将多对多关系变为多对一和一对多关系,我可以这样做吗? – kamaci

+0

级联,AFIK,没有。有两个协会:是的。但我不会。这会让所有事情变得更加复杂。 –