JPA / Hibernate级联持续存在并不起作用

时间:2017-07-26 17:38:04

标签: java spring hibernate jpa

我有一个问题,即将持续操作级联到子级。

我有类。当我用一个带有Spring-Data Repository的子节点保存父节点时,子节点的值都为null或0。

如果我将CascadeType.ALL添加到OneToMany-Annotation,我会收到以下错误: "正在合并同一实体的多个表示"

@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;
}

以下是测试保存对象是否有效的代码:

@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);
}

所以我的方法是在不添加cascadeType Merge的情况下修复级联Persist。什么提示我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您想了解有关将实体映射到数据库的信息,首先Hibernate User Guide是一个很好的资源。

我检查了你的例子,它可以在我的机器(TM)上运行,并有以下的repo声明:

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

春季启动应用程序:

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

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>

我只能建议您首先删除Lombok注释(@ Getter / @ Setter)并手动编写getter / setter,然后查看您的程序可能出错的地方。

PS。它也适用于级联ALL