Jpa 一对多Hibernate实体类+;弹簧靴&x2B;马里亚布例外

Jpa 一对多Hibernate实体类+;弹簧靴&x2B;马里亚布例外,jpa,spring-data-jpa,Jpa,Spring Data Jpa,我创建了一个带有以下基数Person->(多个)地址的表 我使用以下sql在mariaDB中创建了表: create table person (name VARCHAR(100) NOT NULL, personnummer VARCHAR(12) NOT NULL, id INT(11) NOT NULL AUTO_INCREMENT, CONSTRAINT person_pk PRIMARY KEY (id) ); create table adress ( id INT(11) NO

我创建了一个带有以下基数Person->(多个)地址的表 我使用以下sql在mariaDB中创建了表:

create table person
(name VARCHAR(100) NOT NULL,
personnummer VARCHAR(12) NOT NULL,
id INT(11) NOT NULL AUTO_INCREMENT,
CONSTRAINT person_pk PRIMARY KEY (id)
);


create table adress
(
id INT(11) NOT NULL AUTO_INCREMENT,
gata VARCHAR(100) NOT NULL,
postnummer int(12) NOT NULL,
person_id int(11) NOT NULL,
CONSTRAINT adress_pk PRIMARY KEY (id),
CONSTRAINT person_id_foreign FOREIGN KEY (person_id) REFERENCES person(id)
);
实体类如下所示:

主要的“类”实际上只是一个spring引导组件,看起来像:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import se.skv.uhzk.db.entity.Adress;
import se.skv.uhzk.db.entity.Person;

import java.util.ArrayList;
import java.util.List;
@Component
public class TestRunner implements CommandLineRunner {

    private static final Logger logger = LoggerFactory  .getLogger(TestRunner.class);

    @Autowired
    private PersonJpaRepository personRepository;

    @Autowired
    private AdrressJpaRepository adressRepository;

    @Override
    public void run(String... args) throws Exception
    {
        try {
            System.out.println("----------------TestRunner---------------- ");
            logger.info("TestRunner Starting ");
            Person person = new Person();
            person.setName("Alvaro Rubio");
            person.setPersonnummer("7107050852");
            Adress adress = new Adress();
            adress.setGata("el gata");

            List<Adress> l = new ArrayList<>();
            l.add(adress);
            person.setAdresses(l);
            adress.setPerson(person);
            System.out.println("SAVING PERSON ID: " + person.getId());
            personRepository.save(person);

            logger.info("TestRunner # of cities: {}", personRepository.count());

            List<Person> personList = personRepository.findAll();
           
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }



    }

}

我们尝试了许多解决方案,但代码不起作用。我知道我们搬走了

person.setAdresses(l);

这是确定的,然后信息存储在人表中,有人可以帮助我/我们

您在Person类中使用了两次
@OneToMany
注释


在使用
getAddresses()
方法之前,不必使用
@OneToMany
注释。

是的,但即使我删除了它,问题仍然存在。。。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import se.skv.uhzk.db.entity.Adress;
import se.skv.uhzk.db.entity.Person;

import java.util.ArrayList;
import java.util.List;
@Component
public class TestRunner implements CommandLineRunner {

    private static final Logger logger = LoggerFactory  .getLogger(TestRunner.class);

    @Autowired
    private PersonJpaRepository personRepository;

    @Autowired
    private AdrressJpaRepository adressRepository;

    @Override
    public void run(String... args) throws Exception
    {
        try {
            System.out.println("----------------TestRunner---------------- ");
            logger.info("TestRunner Starting ");
            Person person = new Person();
            person.setName("Alvaro Rubio");
            person.setPersonnummer("7107050852");
            Adress adress = new Adress();
            adress.setGata("el gata");

            List<Adress> l = new ArrayList<>();
            l.add(adress);
            person.setAdresses(l);
            adress.setPerson(person);
            System.out.println("SAVING PERSON ID: " + person.getId());
            personRepository.save(person);

            logger.info("TestRunner # of cities: {}", personRepository.count());

            List<Person> personList = personRepository.findAll();
           
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }



    }

}

17:07:41.190 [main] WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1452, SQLState: 23000 
17:07:41.190 [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - (conn=3) Cannot add or update a child row: a foreign key constraint fails (`spring_boot_test`.`adress`, CONSTRAINT `person_id_foreign` FOREIGN KEY (`person_id`) REFERENCES `person` (`id`)) 
17:07:41.195 [main] DEBUG org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl - JDBC transaction marked for rollback-only (exception provided for stack trace) java.lang.Exception: exception just for purpose of providing stack trace  -|-   at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.markRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:324)  -|-    at org.hibernate.engine.transaction.internal.TransactionImpl.markRollbackOnly(TransactionImpl.java:203)  -|-    at org.hibernate.internal.AbstractSharedSessionContract.markForRollbackOnly(AbstractSharedSessionContract.java:392)  -|-    at org.hibernate.internal.ExceptionConverterImpl.handlePersistenceException(ExceptionConverterImpl.java:297)  -|-   at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)  -|-  at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)  -|-  at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)  -|-  at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1348)  -|-   at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:435)  -|-   at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3221)  -|-  at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2389)  -|-   at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)  -|-    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)  -|- at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)  -|-    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)  -|-  at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)  -|-  at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:534)  -|-  at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:744)  -|-   at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:712)  -|-  at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:631)  -|- at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:385)  -|- at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)  -|-   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  -|-   at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)  -|-  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  -|-   at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178)  -|-  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  -|-   at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)  -|- at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  -|-   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)  -|-    at com.sun.proxy.$Proxy131.save(Unknown Source)  -|-    at se.skv.uhzk.TestRunner.run(TestRunner.java:45)  -|-  at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784)  -|-   at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:768)  -|-  at org.springframework.boot.SpringApplication.run(SpringApplication.java:322)  -|-  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)  -|- at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)  -|- at se.skv.bzz.ocp.poc.Application.main(Application.java:15)
17:07:41.196 [main] DEBUG org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl - JDBC transaction marked for rollback-only (exception provided for stack trace) java.lang.Exception: exception just for purpose of providing stack trace  -|-   at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.markRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:324)  -|-    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:192)  -|- at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)  -|-    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)  -|-  at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)  -|-  at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:534)  -|-  at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:744)  -|-   at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:712)  -|-  at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:631)  -|- at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:385)  -|- at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)  -|-   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  -|-   at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)  -|-  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  -|-   at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178)  -|-  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  -|-   at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)  -|- at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  -|-   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)  -|-    at com.sun.proxy.$Proxy131.save(Unknown Source)  -|-    at se.skv.uhzk.TestRunner.run(TestRunner.java:45)  -|-  at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784)  -|-   at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:768)  -|-  at org.springframework.boot.SpringApplication.run(SpringApplication.java:322)  -|-  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)  -|- at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)  -|- at se.skv.bzz.ocp.poc.Application.main(Application.java:15)
17:07:41.201 [main] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl - rollback() called on an inactive transaction 
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:298)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:538)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:744)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:712)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:631)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:385)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy131.save(Unknown Source)
    at se.skv.uhzk.TestRunner.run(TestRunner.java:45)
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784)
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:768)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:322)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
    at se.skv.bzz.ocp.poc.Application.main(Application.java:15)
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3226)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3751)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:91)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)
    at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1344)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:435)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3221)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2389)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:534)
    ... 21 more
person.setAdresses(l);