2015-04-07 60 views
0

我发展我的项目,将在数据库中更新实体的服务器端逻辑。但是这个实体参考了另一个实体的列表。更新数据库时,某些条目被拆除JPA

所以,比如我有一个实体Test像这样的:

@Entity 
    public class Test { 

     @Id 
     @Column(name = "idTest", nullable = false) 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private Long id; 
     private String name; 

     @OneToMany(mappedBy = "idTest", targetEntity = Test2.class, fetch = FetchType.LAZY) 
     private Collection<Test2> test2Collection; 
    } 

其具有Test2实体引用。

@Entity 
public class Test2 { 

    @Id 
    @Column(name = "idTest2", nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String field1; 
    private String field2; 

    @ManyToOne 
    @JoinColumn(name = "idTest", referencedColumnName = "idTest") 
    private Test idTest; 
} 

就我而言,我更新的集合Test进入test2Collection,最终我取出它的一些Test2条目。

EntityManager简单merge方法没有检测到一些条目已被删除,当我称它通过新的更新Test条目。

我正在考虑通过Test条目之间的差异来跟踪从test2Collection中删除的条目,然后再更新数据库和新的Test条目进行更新。

但我不知道这是这样做的唯一的(和最佳)的方式。任何人有另一个想法?

+0

难道你不需要例如OneToMany上的“cascade = CascadeType.ALL”吗? –

回答

2

在你的关系,你必须添加orphanRemoval,然后如果你删除集合中的一个元素,坚持测试,删除了收集将被自动删除TEST2表的元素。

@OneToMany(orphanRemoval = true, mappedBy = "idTest", targetEntity = Test2.class, fetch = FetchType.LAZY) 
    private Collection<Test2> test2Collection; 
+0

谢谢!这种方法比我想象的要好得多! –