Jpa 一对多Hibernate实体类+;弹簧靴&x2B;马里亚布例外
我创建了一个带有以下基数Person->(多个)地址的表 我使用以下sql在mariaDB中创建了表: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
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);