私はSpring Data JPAとSpring Data RESTでSpring Bootを使用しています。双方向SpringデータJPAとSpring RESTの@ManyToManyと@OneToOneの関係を正しく設定できません。
私はTestExectionというクラスを持っていますが、これは複数のTestResultsを持つクラス設定です。 TestExecutionが作成されると、それに設定される結果は作成されません。
後でTestExecutionを実行すると、TestResultオブジェクトが作成されます。
これらのTestResultオブジェクトは、TestExecutionと@OneToOneの関係を持ち、TestResultを保存する前にTestExecutionオブジェクトがTestResultに設定され、save(TestResult)が呼び出されます。
// Create RESULT object
TestResult testResult = new TestResult(someTestExection......);
save(testResult)
私はtestResults/1/testExecutionを見てREST経由で電話をかける場合は、私がtestResultに関連付けられているtestExecutionを見ることができます。私がtestExecutions/1/testResultsに対して同じ呼び出しを行うと、空の[]が返されます。
2質問:
1)私はexpclicitly TestExecutionsのTestResultセットに新しく作成された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)
OR
2)TestResultはTestExecutionを設定したときに、それがリンクされ、そのリストに追加することができるように関係を持つことのセットアップを持っているいくつかの方法がありますか?
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;
TestResult
@Data
@Entity
@Table(name = "test_result")
//@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class TestResult {
private @Id @GeneratedValue Long id;
// TODO switch back to lazy
@OneToOne(fetch = FetchType.EAGER)
//@JsonManagedReference
private TestExecution testExecution;
// TODO switch back to lazy
@OneToOne(fetch = FetchType.EAGER)
private TestSuite testSuite;
両方のリポジトリが設定されている同じ
TestExecutionRepository
@Repository
@Transactional
public interface TestExecutionRepository extends PagingAndSortingRepository<TestExecution, Long> {
TestResultRepository
@Repository
@Transactional
public interface TestResultRepository extends PagingAndSortingRepository<TestResult, Long> {
のAppConfig
@Configuration
@ComponentScan({ "com.miw.mcb.server.dao.repository", "com.miw.mcb.server.model" })
public class AppConfig {
}
SpringBootApp(ReactAndSpringDataRestApplication)
@SpringBootApplication
public class ReactAndSpringDataRestApplication {
public static void main(String[] args) {
SpringApplication.run(ReactAndSpringDataRestApplication.class, args);
}
}
UPDATE:私は@ManyToOneと@OneToManyの更新をしたが、TestResults
があるかの問題がまだあります伝播先TestExecution
ManyToOneとOneToManyの説明をありがとうございます。私はマッピングが正しくないと思った。
実行しているときに、私は次のスタックトレースを得た。その後:result.setTestExecution(実行)用の更新**
testExecution.getTestResults().add(testResult);
save(testExecution)
。 execute.getResults()。add(result); repo.save(実行); **私はロンボク島でのテスト結果のためhasCode()関数を実装する必要がありました。この問題を解決するにはresult
最初**
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"})
。持続するときは、要件に応じてカスケードを設定する必要があります。 – Vaelyr