2017-03-22 56 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。很高興爲你工作 –