2017-07-26 2 views
0

Ich habe ein Problem kaskadieren die persistente Operation auf Kinder.JPA/Ruhezustand kaskadieren persist funktioniert nicht

Ich habe eine Eltern und eine Kind Klasse. Als ich das Elternteil mit einem Kind mit einem Feder Data Repository die Werte des Kindes zu speichern sind all null oder 0

Wenn ich CascadeType.ALL zur OneToMany-Annotation hinzufügen bekomme ich diesen Fehler: „mehr Darstellungen von derselben Einheit verschmolzen werden“

@Entity 
@Getter 
@Setter 
public class TestParent { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @OneToMany(mappedBy = "parent", cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE}, orphanRemoval = true) 
    private List<TestChild> children; 
} 

@Entity 
@Getter 
@Setter 
public class TestChild { 
    @Id 
    @GeneratedValue 
    private Long id; 

    private int value; 

    @ManyToOne 
    private TestParent parent; 
} 

Hier ist der Code zu testen, ob das Speichern der Objekte arbeiten:

@Test 
@Transactional 
public void test123(){ 
    TestParent parent = new TestParent(); 
    parent = testRepo.save(parent); 

    TestChild child1 = new TestChild(); 
    child1.setValue(3); 
    child1.setParent(parent); 
    parent.setChildren(new ArrayList<>()); 
    parent.getChildren().add(child1); 

    parent = testRepo.save(parent); 

    assertThat(parent.getChildren().size()).isNotZero(); 
    assertThat(parent.getChildren().get(0).getValue()).isEqualTo(3); 
} 

Also mein Ansatz ist ohne den Persist zu beheben Kaskadierung dding die cascadeType Merge. Irgendwelche Hinweise, was ich falsch mache?

+0

Dann speichern Sie nicht die Eltern. Der zweite Speichervorgang ist ein Update und somit eine Zusammenführung. Eine Persistenz ist nur für neue nicht persistente Instanzen gültig. Außerdem zerstören Sie die verwaltete Sammlung, indem Sie vor dem Hinzufügen des untergeordneten Objekts eine 'neue ArrayList()' ausführen. Imho Ihr Code ist in mehrfacher Hinsicht fehlerhaft. –

Antwort

1

Zuerst Hibernate User Guide ist eine großartige Ressource, wenn Sie etwas über das Zuordnen von Entitäten zu DB lernen möchten.

checkte ich Ihr Beispiel und es funktioniert auf meinem Rechner (TM) mit folgenden Repo-Erklärung:

public interface PersonRepository extends CrudRepository<HibernateProxyDemoApplication.TestParent, Long> { } 

Und der Frühling Boot-Anwendung:

@SpringBootApplication 
@EnableJpaRepositories // just to make sure 
public class HibernateProxyDemoApplication { 
    public static void main(String[] args) { 
     SpringApplication.run(HibernateProxyDemoApplication.class, args); 
    } 
... 
} 

und pom.xml:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.4.RELEASE</version> 
    <relativePath/> <!-- lookup parent from repository --> 
</parent> 

Ich kann nur vorschlagen, zuerst Lombok Annotationen zu entfernen (@ Getter/@ Setter) a nd, um Getter/Setter manuell zu schreiben und dann nachzusehen, was mit Ihrem Programm falsch ist.

PS. Es funktioniert auch mit Kaskade ALL

+0

Ich habe jetzt auch eine neue SpringBootApplication mit Spring-Boot 1.5.5 erstellt. (Bevor ich 1.4.4 verwendet habe). Aber es funktioniert nicht. Meine Größenabhängigkeiten sind: Spring-Boot-Starter-Daten-Jpa, Mysql-Connector-Java, Spring-Boot-Starter-Test – user3603632

+0

Danke für die Tipps. Upgrade auf Spring-Boot 1.5.5 und mit Cascade ALL funktioniert schließlich. Mit der neuen Spring-Version bekomme ich nicht mehr den Fehler "Mehrfachdarstellungen der gleichen Entität werden zusammengeführt" – user3603632