Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 无法为双向弹簧数据JPA和弹簧座正确设置@ManyToOne和@OneToOne关系_Spring_Spring Boot_Spring Data Jpa_Spring Data Rest_Bidirectional - Fatal编程技术网

Spring 无法为双向弹簧数据JPA和弹簧座正确设置@ManyToOne和@OneToOne关系

Spring 无法为双向弹簧数据JPA和弹簧座正确设置@ManyToOne和@OneToOne关系,spring,spring-boot,spring-data-jpa,spring-data-rest,bidirectional,Spring,Spring Boot,Spring Data Jpa,Spring Data Rest,Bidirectional,我正在使用SpringBoot和SpringDataJPA以及SpringDataREST 我有一个名为TestExection的类,它是一个具有多个测试结果的类设置。创建TestExecution时,没有为其创建结果 稍后运行TestExecution时,将创建TestResult对象 这些TestResult对象与TestExecution具有@OneToOne关系,在保存TestResult之前,在TestResult上设置TestExecution对象,并调用save(TestResul

我正在使用SpringBoot和SpringDataJPA以及SpringDataREST

我有一个名为TestExection的类,它是一个具有多个测试结果的类设置。创建TestExecution时,没有为其创建结果

稍后运行TestExecution时,将创建TestResult对象

这些TestResult对象与TestExecution具有@OneToOne关系,在保存TestResult之前,在TestResult上设置TestExecution对象,并调用save(TestResult)

  // Create RESULT object
  TestResult testResult = new TestResult(someTestExection......);
  save(testResult)
如果我通过REST调用以查看testResults/1/testExecution,我可以看到与testResult关联的testExecution。如果我对testExecutions/1/testResults进行相同的调用,它将返回一个空[]

2个问题:

1) 我是否需要将新创建的TestResult对象显式地设置到TestExecutions的TestResult集中

  testExecution.getTestResults().add(testResult);
  save(testExecution)
  • 当我尝试此操作时,它会导致附加的堆栈跟踪

    Hibernate: update test_execution set description=?, owner=?, version=? where id=? and version=?
    [WARNING]
    java.lang.reflect.InvocationTargetException
        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:497)
        at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:478)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.StackOverflowError
        at com.miw.mcb.server.model.TestExecution.hashCode(TestExecution.java:32)
        at com.miw.mcb.server.model.TestResult.hashCode(TestResult.java:30)
        at java.util.AbstractSet.hashCode(AbstractSet.java:126)
        at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:448)
        at com.miw.mcb.server.model.TestExecution.hashCode(TestExecution.java:32)
        at com.miw.mcb.server.model.TestResult.hashCode(TestResult.java:30)
        at java.util.AbstractSet.hashCode(AbstractSet.java:126)
        at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:448)
    

2) 是否有某种方法可以将其设置为具有关系,以便在TestResult设置TestExecution时,可以将其链接并添加到列表中

测试执行

  @Data
  @Entity
  @Table(name = "test_execution")
  //@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
  public class TestExecution {

      private @Id @GeneratedValue Long id;

      // TODO set back to lazy
      @ManyToMany(fetch = FetchType.EAGER)
      //@JsonBackReference
      private Set<TestResult> testResults;

      // TODO set back to lazy
      @ManyToMany(fetch = FetchType.EAGER)
      private Set<TestSuite> testSuites;
两个存储库的设置相同

TestExecutionRepository

@Repository
@Transactional
public interface TestExecutionRepository extends PagingAndSortingRepository<TestExecution, Long> {
@Repository
@Transactional
public interface TestResultRepository extends PagingAndSortingRepository<TestResult, Long> {
SpringBootApp(反应SpringDataRestapplication)

更新:我对@manytone和@OneToMany进行了更新,但仍然存在如何将
测试结果传播到
测试执行的问题


谢谢你对许多公司的解释。我以为我的地图不正确

之后,我在运行时得到以下堆栈跟踪:

 testExecution.getTestResults().add(testResult); 
 save(testExecution)
**更新result.setTestExecution(执行);execution.getResults().add(结果);回购保存(执行);不先保存
结果
**

java.lang.StackOverflowError: null
  at com.miw.mcb.server.model.TestExecution.hashCode(TestExecution.java:26)
  at com.miw.mcb.server.model.TestResult.hashCode(TestResult.java:35)
  at java.util.AbstractSet.hashCode(AbstractSet.java:126)
  at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:448)
  at com.miw.mcb.server.model.TestExecution.hashCode(TestExecution.java:26)
  at com.miw.mcb.server.model.TestResult.hashCode(TestResult.java:35)
  at java.util.AbstractSet.hashCode(AbstractSet.java:126)
  at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:448)
  at com.miw.mcb.server.model.TestExecution.hashCode(TestExecution.java:26)
  at com.miw.mcb.server.model.TestResult.hashCode(TestResult.java:35)
  at java.util.AbstractSet.hashCode(AbstractSet.java:126)...
**为了解决这个问题,我必须用Lombok为测试结果实现hasCode()函数**

 @EqualsAndHashCode(exclude={"id", "testExecution", "device", "testCase"})

我认为你对JPA注释的选择是错误的。此外,我甚至不明白这是怎么回事

事实上,
@manytomy
关系表示一种关系,其中一个实体的每个元素都可以与另一个实体中的任何人关联。你需要一个中间的桌子。这意味着单个
TestResult
可以与多个执行链接

另一方面,您提供了一个
@OneToOne
映射,这是另一种方式,仅为该对象提供另一方的一个实体实例

您管理它的方式看起来像您想要的是一个
@OneToMany
,它将允许
TestExecution
控制
testResults
集合,这意味着一个测试执行可以有多个结果,但每个结果只属于一个执行

测试执行:

通过这种方式,您可以让TextExecution管理其TestResult集合(使用
CascadeType.ALL
在保存TestExecution对象时将更改传播到集合中)

另请参见:


您需要通过提供
mappedBy
属性来设置关系的所有者端。坚持的时候,你需要根据你的需求设置级联。感谢你对manytone和OneToMany的解释。我以为我的地图不正确。但我仍然有一个问题,因为现在我继续得到同样的结果。
TestResult
如何传播到
TestExecution
对象中?我是否必须保存
TestResult
,然后获取此对象并将其添加到
TestExecution
集中?或者在使用
TestResult
对象上设置的
TestExecution
保存
TestResult
时,是否应该这样做?例如:使用
TestExecution
设置
TestResult
保存时,仍然会在“TestExecution”保存(TestResult)时留下一个空白结果集然后我是否调用将其添加到
TestExecution
TestExecution.getTestResults().add(testResult)中;保存(testExecution)看起来我还必须实现自己的hashCode()来停止重复。我尝试了一个基本的一个,但它没有工作,所以我会考虑在这方面的工作。谢谢我更新了使用tell Lombok设置equalsAndHashCode
@equalsAndHashCode(排除={“id”、“testExecution”、“device”、“testCase”})
非常感谢您的帮助,我将更新我的问题/答案
 testExecution.getTestResults().add(testResult); 
 save(testExecution)
java.lang.StackOverflowError: null
  at com.miw.mcb.server.model.TestExecution.hashCode(TestExecution.java:26)
  at com.miw.mcb.server.model.TestResult.hashCode(TestResult.java:35)
  at java.util.AbstractSet.hashCode(AbstractSet.java:126)
  at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:448)
  at com.miw.mcb.server.model.TestExecution.hashCode(TestExecution.java:26)
  at com.miw.mcb.server.model.TestResult.hashCode(TestResult.java:35)
  at java.util.AbstractSet.hashCode(AbstractSet.java:126)
  at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:448)
  at com.miw.mcb.server.model.TestExecution.hashCode(TestExecution.java:26)
  at com.miw.mcb.server.model.TestResult.hashCode(TestResult.java:35)
  at java.util.AbstractSet.hashCode(AbstractSet.java:126)...
 @EqualsAndHashCode(exclude={"id", "testExecution", "device", "testCase"})
@OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL, mappedBy="testExecution")
private Set<TestResult> testResults;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="id_test_result")
private TestExecution testExecution;