2017-03-22 54 views
1

我有2个实体使用@OneToOne关系这样加入:休眠/ JPA持续映射OneToOne与序列发生器

public class FirstEntity { 

    @Id 
    @Column(name = "FIRST_ID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_FIRST") 
    private Long ID; 

    @OneToOne(mappedBy = "first", targetEntity = SecondEntity.class, cascade = CascadeType.MERGE) 
    private SecondEntity second; 
} 

而其他实体那样:

public class SecondEntity { 

    @Id 
    @Column(name = "SECOND_ID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_SECOND") 
    private Long ID; 

    @OneToOne(targetEntity = firstEntity.class) 
    @JoinColumn(name = "H_FIRST_FK") 
    private FirstEntity first; 
} 

但是,当我想添加一个新的第一个实体并将第二个实体(已经存在)链接到它我有几个问题。

FirstEntity firstEntity = mapper.toEntity(firstDto); 
    if(firstDto.getSecond() != null) { 
     firstEntity.getSecond().setFirst(first); 
    } 

    firstRepository.save(firstEntity); 

问题:有了这个代码,我得到了一个“拆离实体”的错误,可能是因为Hibernate可以不设置第一实体的ID,因为它是一个SQL生成器。

有了这个代码:

FirstEntity firstEntity = mapper.toEntity(firstDto); 
    firstRepository.save(firstEntity); 
    if(firstDto.getSecond() != null) { 
     firstEntity.getSecond().setFirst(first); 
    } 

问题:没有被保存以供secondEntity和映射设置..

就目前而言,这似乎是工作的唯一的东西这样的:

FirstEntity firstEntity = mapper.toEntity(firstDto); 
    firstRepository.save(firstEntity); 
    if(firstDto.getSecond() != null) { 
     firstEntity.getSecond().setFirst(first); 
    } 
    firstRepository.save(firstEntity); 

有没有办法来告诉Hibernate来:

  • 获得下一序列
  • 保存第一
  • 合并第二,第一为FK 的ID在一个指令而不是做2手动保存?

所有这一切都不需要双重保存?

回答

1

所以我假设SecondEntity已经有一个@Id字段集。

正如你已经有了正确的级联选项:cascade = CascadeType.MERGE,我会简单地替换在第一个例子合并保存:

FirstEntity firstEntity = mapper.toEntity(firstDto); 
if(firstDto.getSecond() != null) { 
    firstEntity.getSecond().setFirst(first); 
} 

firstRepository.merge(firstEntity); 

这将坚持新FirstEntity实例,然后合并SecondEntity。

只要记住,如果你想在合并后的第一个实体进行任何操作,你就必须在新的实例工作:

FirstEntity mergedFirstEntity = firstRepository.merge(firstEntity); 
// operations on mergedFirstEntity from now on 
+0

非常感谢,我从来没有想到这样简单的事情那样:o – Florian

+1

hehe。很高兴为你工作 –