PSQLException“在表上插入或更新违反外键约束”,“表中不存在键”

问题描述

我正在学习Spring Security。我使用Hibernate和Postgresql我有一个用户登录项目,但是运行该项目时出现错误。无法插入user_authority值。错误是这个

org.postgresql.util.PsqlException: ERROR: insert or update on table "user_authority" violates foreign key constraint "fkhi46vu7680y1hwvmnnuh4cybx"
  Detail: Key (user_id)=(1) is not present in table "users".

我在其上进行构建的基础项目具有MysqL数据库,因此问题可能出在数据库应用程序上。该基础项目在那里:DZone

这里是用户实体代码错误消息和 hibernate.cfg.xml 。如何解决

package com.howtodoinjava.demo.spring.domain;

import org.hibernate.validator.constraints.NotEmpty;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "users")
public class User implements Serializable {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;
   @NotEmpty
   @Column(nullable = false,unique = true)
   private String username;
   @NotEmpty
   private String password;
   private Date dateCreated;
   @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
   @JoinTable(name = "user_authority",joinColumns = @JoinColumn(name = "user_id"),inverseJoinColumns = @JoinColumn(name = "authority_id")
   )
   private Set<Authority> authorities = new HashSet<>();
   public User() {
   }

   public Integer getId() {
      return id;
   }

   public void setId(Integer id) {
      this.id = id;
   }

   public String getUsername() {
      return username;
   }

   public void setUsername(String username) {
      this.username = username;
   }

   public String getpassword() {
      return password;
   }

   public void setPassword(String password) {
      this.password = password;
   }

   public Date getDateCreated() {
      return dateCreated;
   }

   public void setDateCreated(Date dateCreated) {
      this.dateCreated = dateCreated;
   }

   public Set<Authority> getAuthorities() {
      return authorities;
   }

   public void setAuthorities(Set<Authority> authorities) {
      this.authorities = authorities;
   }
}

(...)
    Hibernate: alter table if exists user_authority add constraint FKhi46vu7680y1hwvmnnuh4cybx foreign key (user_id) references users
    2020-09-18 18:50:57 INFO  SchemaCreatorImpl:489 - HHH000476: Executing import script 'ScriptSourceInputFromUrl(file:/home/u/tomcat/webapps/ROOT/WEB-INF/classes/import.sql)'
    2020-09-18 18:50:57 DEBUG sql:92 - INSERT INTO authority (name,id) VALUES ('ROLE_ADMIN',1)
    Hibernate: INSERT INTO authority (name,1)
    2020-09-18 18:50:57 DEBUG sql:92 - INSERT INTO authority (name,id) VALUES ('ROLE_USER',2)
    Hibernate: INSERT INTO authority (name,2)
    2020-09-18 18:50:57 DEBUG sql:92 - INSERT INTO user_authority (authority_id,user_id) VALUES (1,1)
    Hibernate: INSERT INTO user_authority (authority_id,1)
    2020-09-18 18:50:57 DEBUG NewPooledConnection:207 - com.mchange.v2.c3p0.impl.NewPooledConnection@62880d handling a throwable.
    org.postgresql.util.PsqlException: ERROR: insert or update on table "user_authority" violates foreign key constraint "fkhi46vu7680y1hwvmnnuh4cybx"
      Detail: Key (user_id)=(1) is not present in table "users".
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
        at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
        at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
        at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:307)
        at org.postgresql.jdbc.PgStatement.executeCachedsql(PgStatement.java:293)
        at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:270)
        at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:266)
        at com.mchange.v2.c3p0.impl.NewProxyStatement.execute(NewProxyStatement.java:75)
        at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
        at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applysqlString(SchemaCreatorImpl.java:440)
        at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applyImportSources(SchemaCreatorImpl.java:491)
        at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:180)
        at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135)
        at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121)
        at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:155)
        at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:313)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:452)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
        at org.springframework.orm.hibernate5.LocalSessionfactorybean.buildSessionFactory(LocalSessionfactorybean.java:616)
        at org.springframework.orm.hibernate5.LocalSessionfactorybean.afterPropertiesSet(LocalSessionfactorybean.java:600)
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.invokeInitMethods(AbstractAutowireCapablebeanfactory.java:1862)
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.initializeBean(AbstractAutowireCapablebeanfactory.java:1799)
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:595)
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:517)
        at org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:323)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:321)
        at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:202)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
        at org.springframework.beans.factory.support.DefaultListablebeanfactory.doResolveDependency(DefaultListablebeanfactory.java:1287)
        at org.springframework.beans.factory.support.DefaultListablebeanfactory.resolveDependency(DefaultListablebeanfactory.java:1207)
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:874)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:778)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:226)
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.autowireConstructor(AbstractAutowireCapablebeanfactory.java:1358)
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBeanInstance(AbstractAutowireCapablebeanfactory.java:1204)
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:557)
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:517)
        at org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:323)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:321)
        at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:202)
        at org.springframework.beans.factory.support.DefaultListablebeanfactory.preInstantiateSingletons(DefaultListablebeanfactory.java:879)
        at org.springframework.context.support.AbstractApplicationContext.finishbeanfactoryInitialization(AbstractApplicationContext.java:878)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
        at org.springframework.web.context.ContextLoaderListener.contextinitialized(ContextLoaderListener.java:103)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4676)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5139)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1727)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:288)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at org.apache.catalina.mbeans.Mbeanfactory.createStandardContext(Mbeanfactory.java:456)
        at org.apache.catalina.mbeans.Mbeanfactory.createStandardContext(Mbeanfactory.java:405)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:288)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
        at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
        at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
        at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
        at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
        at sun.rmi.transport.Transport$1.run(Transport.java:200)
        at sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    2020-09-18 18:50:57 DEBUG sqlUtils:207 - Attempted to convert sqlException to sqlException. Leaving it alone. [sqlState: 23503; errorCode: 0]
    org.postgresql.util.PsqlException: ERROR: insert or update on table "user_authority" violates foreign key constraint "fkhi46vu7680y1hwvmnnuh4cybx"
      Detail: Key (user_id)=(1) is not present in table "users".
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
        at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
(...)

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.archive.autodetection">class,hbm</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgres</property> <!-- BD Mane -->
        <property name="connection.driver_class">org.postgresql.Driver</property> <!-- DB Driver -->
        <property name="connection.username">postgres</property> <!-- DB User -->
        <property name="connection.password">postgres</property> <!-- DB Password -->
        <property name="dialect">org.hibernate.dialect.Postgresql95Dialect</property>
        <property name="hibernate.hbm2ddl.auto">create</property>
        <property name="connection.pool.size">1</property>
        <property name="hibernate.enable_lazy_load_no_trans">true</property>
        <property name="hibernate.jdbc.lob.non_contextual_creation">true</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.timeout">1800</property>
        <property name="hibernate.c3p0.max_statements">150</property>

        <mapping class="com.howtodoinjava.demo.spring.domain.User"/>
        <mapping class="com.howtodoinjava.demo.spring.domain.Authority"/>
        <mapping class="com.howtodoinjava.demo.spring.domain.AuthorityType"/>

    </session-factory>
</hibernate-configuration>

编辑

这里是库版本:

    <spring.version>5.2.0.RELEASE</spring.version>
    <hibernate.version>5.4.2.Final</hibernate.version>
    <hibernate.validator>5.4.1.Final</hibernate.validator>
    <c3p0.version>0.9.5.2</c3p0.version>
    <jstl.version>1.2.1</jstl.version>
    <tld.version>1.1.2</tld.version>
    <servlets.version>3.1.0</servlets.version>
    <jsp.version>2.3.1</jsp.version>
    <hsqldb.version>1.8.0.10</hsqldb.version>
    <spring-security.version>5.2.0.RELEASE</spring-security.version>
    <postgresql.version>42.2.5</postgresql.version>
    <log4j-api.version>2.13.3</log4j-api.version>
    <hibernate-validator.version>6.0.13.Final</hibernate-validator.version>
    <tiles-extras.version>3.0.8</tiles-extras.version>
    <javax.servlet-api.version>4.0.1</javax.servlet-api.version>
    <jstl.version>1.2</jstl.version>

使用 import.sql 文件处理插入,该文件位于资源目录中:

INSERT INTO authority (name,1);
INSERT INTO authority (name,2);
INSERT INTO user_authority (authority_id,1);
INSERT INTO user_authority (authority_id,user_id) VALUES (2,2);
INSERT INTO users (id,username,password,dateCreated) VALUES (1,'ironman','$2a$10$jXlure/BaO7K9WSQ8AMIoU3Ih3Am3kmmnVkWWHZEcQryZ8QPO3FgC','2015-11-15 22:14:54');
INSERT INTO users (id,dateCreated) VALUES (2,'rabi','$2a$10$0tFJKcOV/Io6I3vWs9/Tju8OySoyMTpGAyO0zaAOCswMbpfma0BSK','2015-10-15 22:14:54');

解决方法

我必须对 import.sql 文件中的插入进行重新排序:

INSERT INTO authority (name,id) VALUES ('ROLE_ADMIN',1);
INSERT INTO authority (name,id) VALUES ('ROLE_USER',2);
INSERT INTO users (id,username,password,dateCreated) VALUES (1,'ironman','$2a$10$jXlure/BaO7K9WSQ8AMiOu3Ih3Am3kmmnVkWWHZEcQryZ8QPO3FgC','2015-11-15 22:14:54');
INSERT INTO users (id,dateCreated) VALUES (2,'rabi','$2a$10$0tFJKcOV/Io6I3vWs9/Tju8OySoyMTpGAyO0zaAOCswMbpfma0BSK','2015-10-15 22:14:54');
INSERT INTO user_authority (authority_id,user_id) VALUES (1,1);
INSERT INTO user_authority (authority_id,user_id) VALUES (2,2);
,

您可能在ipyparallel表上有foreign keys指向user_authorityusers表,因此您需要首先填充该表。