Spring 未与父ID映射的多工单
我正在尝试在我的spring boot应用程序中实现测试,但我在许多One/OneToMany链接方面遇到了问题 似乎没有创建子对象的链接,而我使用CascadeType=ALL 我尝试在BusinesDomain.addSubdomain中创建它,添加“subDomain.domain(this);”,但这会导致循环 我发现其他话题也有同样的错误,但似乎没有一个涵盖了我的问题 你能帮我找出问题所在吗 非常感谢 这里是我的实体Spring 未与父ID映射的多工单,spring,hibernate,jpa,spring-boot,Spring,Hibernate,Jpa,Spring Boot,我正在尝试在我的spring boot应用程序中实现测试,但我在许多One/OneToMany链接方面遇到了问题 似乎没有创建子对象的链接,而我使用CascadeType=ALL 我尝试在BusinesDomain.addSubdomain中创建它,添加“subDomain.domain(this);”,但这会导致循环 我发现其他话题也有同样的错误,但似乎没有一个涵盖了我的问题 你能帮我找出问题所在吗 非常感谢 这里是我的实体 import lombok.AccessLevel; import
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
import lombok.experimental.Accessors;
@Accessors(fluent = true)
@Data
@Entity
@NoArgsConstructor
public class BusinessDomain {
@Setter(AccessLevel.NONE)
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@NonNull
@Column(unique=true)
private String name;
@OneToMany(mappedBy = "domain", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<BusinessSubDomain> subDomains = new LinkedHashSet<>();
public void addSubDomain(BusinessSubDomain subDomain) {
subDomains.add(subDomain);
}
}
@Accessors(fluent = true)
@Data
@Entity
@NoArgsConstructor
public class BusinessSubDomain {
@Setter(AccessLevel.NONE)
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@ManyToOne(optional = false)
@JoinColumn(name = "business_domain_id", referencedColumnName="id")
private BusinessDomain domain;
}
通过此操作,我得到了错误消息:
[主要]信息
com.myproject.project.test.model.soadatamodel.business.domaining.BusinessDomainTest
-在24.161秒内启动BusinessDomainTest(JVM运行时间为26.159)[main]INFO org.springframework.test.context.transaction.TransactionContext-
已开始测试上下文的事务(1)[DefaultTestContext@76480730
testClass=BusinessDomainTest,testInstance=
com.myproject.project.test.model.soadatamodel.business.domaining。BusinessDomainTest@405a296e,
testMethod=createBusinessDomainWithArea@BusinessDomainTest,
testException=[null],mergedContextConfiguration=
[WebMergedContextConfiguration@5f5c2451测试类=
BusinessDomainTest,位置='{}',类='{class
com.myproject.project.TestApplication}',ContextInitializerClass=
“[]”,activeProfiles=“{}”,propertySourceLocations=“{}”,
财产来源财产=
“{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}”,
上下文定制器=
设置[org.springframework.boot.test.context]。SpringBootTestContextCustomizer@6eceb130,
org.springframework.boot.test.context.filter。ExcludeFilterContextCustomizer@47db50c5,
org.springframework.boot.test.mock.mockito。MockitoContextCustomizer@0,
org.springframework.boot.test.autoconfigure.properties。PropertyMappingContextCustomizer@0,
org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@68ceda24],
resourceBasePath='src/main/webapp',contextLoader=
'org.springframework.boot.test.context.SpringBootContextLoader',
父项=[null]]];事务管理器
[org.springframework.orm.jpa。JpaTransactionManager@28d97205]; 回降
[true][main]信息
org.hibernate.hql.internal.QueryTranslatorFactoryInitiator-
HH000397:使用ASTQueryTranslatorFactory休眠:选择
businessdo0.id为id1\u 1\u,businessdo0.description为descrippt2\u 1\u,
businessdo0。名称为name3\u 1\u来自BusinessDomain businessdo0\u其中
businessdo0_u0.name=?Hibernate:调用Hibernate\u序列的下一个值
Hibernate:调用Hibernate_序列[main]警告的下一个值
org.hibernate.engine.jdbc.spi.SqlExceptionHelper-SQL错误:23502,
SQLState:23502[main]错误
org.hibernate.engine.jdbc.spi.SqlExceptionHelper-不允许为NULL
对于“业务\域\ ID”列;SQL语句:插入到
BusinessSubDomain(描述、业务域id、名称、id)值
(?,?,?,?)[23502-168][main]信息
org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl-
HH000010:批处理发布时,它仍然包含JDBC语句
org.springframework.dao.DataIntegrityViolationException:无法
执行语句;SQL[n/a];约束[null];嵌套异常是
org.hibernate.exception.ConstraintViolationException:无法
在处执行语句
org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:278)
在
org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateException如果可能(HibernateJpaDialect.java:244)
在
org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.TranslateException如果可能(AbstractEntityManagerFactoryBean.java:488)
在
org.springframework.dao.support.ChainedPersistenceExceptionTranslator.TranslateException如果可能(ChainedPersistenceExceptionTranslator.java:59)
在
org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
在
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179)
在
org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179)
在
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179)
在
org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179)
在
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
位于com.sun.proxy.$Proxy134.findByName(未知源)
com.myproject.project.service.soadatamodel.business.domaining.impl.BusinessDomainServiceImpl.findByName(BusinessDomainServiceImpl.java:40)
位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
invoke(NativeMethodAccessorImpl.java:62)
在
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.lang.reflect.Method.invoke(Method.java:483)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
在
org.springframework.aop.framew
@Override
public BusinessDomain saveOrUpdate(BusinessDomain businessDomain) throws OrcaException {
try {
BusinessDomain domain = businessDomainRepository.findByName(businessDomain.name());
if(null == domain) {
// Repository class not overriden (extends CrudRepository<BusinessDomain, Long>)
return businessDomainRepository.save(businessDomain);
} else {
domain.description(businessDomain.description());
domain.subDomains(businessDomain.subDomains());
return businessDomainRepository.save(domain);
}
} catch (Exception e) {
throw new OrcaException(e);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class BusinessDomainTest {
@Test
@Transactional
public void createBusinessDomainWithSubDomain() throws OrcaException {
BusinessDomain passengerBusinessDomain = new BusinessDomain().name(DOMAIN_NAME).description(DOMAIN_DESCRIPTION);
BusinessSubDomain distributionBusinessSubDomain = new BusinessSubDomain().name(SUBDOMAIN_NAME)
.description(SUBDOMAIN_DESCRIPTION);
passengerBusinessDomain.addSubDomain(distributionBusinessSubDomain);
businessDomainService.saveOrUpdate(passengerBusinessDomain);
BusinessDomain domain = businessDomainService.findByName(DOMAIN_NAME);
}
}
public void addSubDomain(BusinessSubDomain subDomain) {
subDomains.add(subDomain);
subDomain.domain(this);
}