2017-06-30 2 views
0

Hier ist meine objets:Stackoverflow mit Spring Data JPA FindOne

Schritt (4 Klassen)

@Entity 
@Table(name = "step") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@Data 
public abstract class AbstractStep implements Serializable { 

    @EmbeddedId 
    private StepKey key; 

    @Column 
    private String htmlContent; 

    @Column 
    private Boolean passed; 
} 

@Builder 
@Getter 
@Setter 
@EqualsAndHashCode 
@Embeddable 
public class StepKey implements Serializable { 

    @Column 
    private Integer numberStep; 

    @ManyToOne 
    private TestableEquipment equipment; 

} 

@Entity 
@Table(name = "esthetic_step") 
@Data 
@EqualsAndHashCode(callSuper = false) 
public class EstheticStep extends AbstractStep { 

    @Column 
    @Enumerated(EnumType.STRING) 
    private EstheticState selectedEstheticState; 
} 

@Entity 
@Table(name = "functional_step") 
@Data 
@EqualsAndHashCode(callSuper = false) 
public class FunctionalStep extends AbstractStep { 

    @Column 
    private String labelBreakdown; 
} 

Ausstattung:

@Entity 
@Table(name = "testable_equipment") 
@Getter 
@Setter 
@EqualsAndHashCode 
public class TestableEquipment implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @OneToMany(mappedBy = "key.equipment", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<AbstractStep> steps = new ArrayList<>(); 
} 

Es gibt mehrere Felder in diesen Klassen in Wirklichkeit aber ich vereinfacht, um besser lesbar zu sein.

Mein Problem ist, dass ich ein Gerät mit 3 Schritten erstellen:

equipment = Equipment 
      .builder() 
      .id(1L) 
      .build(); 
    List<AbstractStep> equipmentSteps = new ArrayList<>(); 
    fs1 = new FunctionalStep(); 
    fs1.setHtmlContent("htmlContent1"); 
    fs1.setKey(new StepKey(1, equipment)); 
    fs1.setLabelBreakdown("breakdown1"); 
    fs1.setPassed(null); 
    fs2 = new FunctionalStep(); 
    fs2.setHtmlContent("htmlContent2"); 
    fs2.setKey(new StepKey(2, equipment)); 
    fs2.setLabelBreakdown("breakdown2"); 
    fs2.setPassed(null); 
    fs3 = new FunctionalStep(); 
    fs3.setHtmlContent("htmlContent3"); 
    fs3.setKey(new StepKey(3, equipment)); 
    fs3.setLabelBreakdown("breakdown3"); 
    fs3.setPassed(null); 
    equipmentSteps.add(fs1); 
    equipmentSteps.add(fs2); 
    equipmentSteps.add(fs3); 
    equipment.setSteps(equipmentSteps); 
    equipmentRepository.saveAndFlush(equipment); 

Wenn ich anrufen versuchen: equipmentRepository.findOne (1 l);

Hibernate-Schleife in der gleichen Auswahl und eine StackOverflowException ist werfen.

Ich verstehe nicht, weil ich eine bidirektionale Verbindung mache.

Jemand hat eine Idee?

EDIT

Verfahren FindOne() wird in einem Test genannt

@Test(expected = ServiceEquipmentException.class) 
public void beginTestTestWithEstheticStepNotDefined() throws ServiceEquipmentException { 
    Equipment equipment = equipmentRepository.findOne(1L); 
    System.err.println(equipment); 
} 

TRACE:

java.lang.Exception: Unexpected exception, expected<com.nordnet.testing.logic.services.exception.ServiceTestableEquipmentException> but was<java.lang.StackOverflowError> 
    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.StackOverflowError 
    at org.h2.command.Parser.getTokenType(Parser.java:3788) 
    at org.h2.command.Parser.read(Parser.java:3254) 
    at org.h2.command.Parser.readIdentifierWithSchema(Parser.java:3135) 
    at org.h2.command.Parser.readTableFilter(Parser.java:1214) 
    at org.h2.command.Parser.readJoin(Parser.java:1532) 
    at org.h2.command.Parser.parseJoinTableFilter(Parser.java:1942) 
    at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1898) 
    at org.h2.command.Parser.parseSelectSimple(Parser.java:2045) 
    at org.h2.command.Parser.parseSelectSub(Parser.java:1891) 
    at org.h2.command.Parser.parseSelectUnion(Parser.java:1709) 
    at org.h2.command.Parser.parseSelect(Parser.java:1697) 
    at org.h2.command.Parser.parsePrepared(Parser.java:445) 
    at org.h2.command.Parser.parse(Parser.java:317) 
    at org.h2.command.Parser.parse(Parser.java:289) 
    at org.h2.command.Parser.prepareCommand(Parser.java:254) 
    at org.h2.engine.Session.prepareLocal(Session.java:561) 
    at org.h2.engine.Session.prepareCommand(Session.java:502) 
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1203) 
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73) 
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:287) 
    at sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) 
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108) 
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81) 
    at com.sun.proxy.$Proxy61.prepareStatement(Unknown Source) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.prepareQueryStatement(AbstractLoadPlanBasedLoader.java:241) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:185) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:121) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4019) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) 
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1022) 
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:639) 
    at org.hibernate.type.EntityType.resolve(EntityType.java:431) 
    at org.hibernate.type.ComponentType.resolve(ComponentType.java:687) 
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.resolveEntityKey(EntityReferenceInitializerImpl.java:142) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.resolveEntityKey(AbstractRowReader.java:143) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:94) 
    at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:239) 
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4019) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) 
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1022) 
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:639) 
    at org.hibernate.type.EntityType.resolve(EntityType.java:431) 
    at org.hibernate.type.ComponentType.resolve(ComponentType.java:687) 
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.resolveEntityKey(EntityReferenceInitializerImpl.java:142) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.resolveEntityKey(AbstractRowReader.java:143) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:94) 
    at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:239) 
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4019) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) 
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1022) 
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:639) 
    at org.hibernate.type.EntityType.resolve(EntityType.java:431) 
    at org.hibernate.type.ComponentType.resolve(ComponentType.java:687) 
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.resolveEntityKey(EntityReferenceInitializerImpl.java:142) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.resolveEntityKey(AbstractRowReader.java:143) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:94) 
    at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:239) 
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4019) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) 
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1022) 
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:639) 
    at org.hibernate.type.EntityType.resolve(EntityType.java:431) 
    at org.hibernate.type.ComponentType.resolve(ComponentType.java:687) 
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.resolveEntityKey(EntityReferenceInitializerImpl.java:142) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.resolveEntityKey(AbstractRowReader.java:143) 
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:94) 
    at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:239) 
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122) 
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4019) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 
... 

Es Schleife in diesem select:

Hibernate: select testableeq0_.id as id1_1_0_, testableeq0_.active as active2_1_0_, testableeq0_.breakdown as breakdow3_1_0_, testableeq0_.client_id as client_i4_1_0_, testableeq0_.create_at as create_a5_1_0_, testableeq0_.equipment_key as equipmen6_1_0_, testableeq0_.esthetic_state as esthetic7_1_0_, testableeq0_.global_state as global_s8_1_0_, testableeq0_.keep_pieces as keep_pie9_1_0_, testableeq0_.local as local10_1_0_, testableeq0_.lot_number as lot_num11_1_0_, testableeq0_.mac_addr as mac_add12_1_0_, testableeq0_.manufacture_warranty_end_date as manufac13_1_0_, testableeq0_.on_warranty as on_warr14_1_0_, testableeq0_.provisionable as provisi15_1_0_, testableeq0_.provisioning_mode as provisi16_1_0_, testableeq0_.reconditionnable as recondi17_1_0_, testableeq0_.ref_catalog as ref_cat18_1_0_, testableeq0_.result_test as result_19_1_0_, testableeq0_.return_mode as return_20_1_0_, testableeq0_.rma_date as rma_dat21_1_0_, testableeq0_.serial as serial22_1_0_, testableeq0_.test_state as test_st23_1_0_, testableeq0_.testable as testabl24_1_0_, testableeq0_.type_materiel as type_ma25_1_0_, steps1_.equipment as equipmen7_0_1_, steps1_.number_step as number_s2_0_1_, steps1_.equipment as equipmen7_0_2_, steps1_.number_step as number_s2_0_2_, steps1_.html_content as html_con3_0_2_, steps1_.passed as passed4_0_2_, steps1_.selected_esthetic_state as selected5_0_2_, steps1_.label_breakdown as label_br6_0_2_, steps1_.dtype as dtype1_0_2_ from testable_equipment testableeq0_ left outer join step steps1_ on testableeq0_.id=steps1_.equipment where testableeq0_.id=? 

EDIT 2

EquipmentRepository:

@Repository 
public interface EquipmentRepository extends JpaRepository<Equipment, Long> { 

} 

StepRepositories:

@Repository 
public interface StepRepository extends JpaRepository<AbstractStep, StepKey> { 

    public AbstractStep findByKey(final StepKey key); 

} 

@NoRepositoryBean 
public interface StepBaseRepository<T extends AbstractStep> extends JpaRepository<T, StepKey> { 

} 

@Repository 
public interface EstheticStepRepository extends StepBaseRepository<EstheticStep> { 

} 

@Repository 
public interface FunctionalStepRepository extends StepBaseRepository<FunctionalStep> { 

    public List<FunctionalStep> findByLabelBreakdown(final String labelBreakdown); 

} 
+0

Können Sie Ihren Code, der 'findOne' Aufruf und auch die Ausnahme Stacktrace haben. – Swapnil

+0

Ich habe den Beitrag mit der in meinem Test aufgerufenen Methode und der Ablaufverfolgung bearbeitet. – BlaCkOmN

+0

FWIW Die JPA API hat keine solche Methode 'findOne'. Das ist Spring Data JPA ...! = JPA API –

Antwort

0

So fand ich die Antwort, es ist, weil ich dachte, dass ein Richtungsunempfindlicher Verein auf beiden Seiten EAGER sein coulb (i‘ Ich bin ein Anfänger). Aber anscheinend ist es einfach unmöglich. So eine Seite ist zwangsläufig in LAZY Abrufmodus.