Java 带序列生成器的Hibernate/JPA持久映射OneTONE
我使用Java 带序列生成器的Hibernate/JPA持久映射OneTONE,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我使用@OneToOne关系连接了两个实体,如下所示: public class FirstEntity { @Id @Column(name = "FIRST_ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_FIRST") private Long ID; @OneToOne(mappedBy = "first", targetEntity = Secon
@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与第一个id合并 在一条指令中而不是手动执行两次保存
所有这些都不需要双重保存?因此我假设第二个实体已经设置了@Id字段 由于您已经有了正确的cascade选项:
cascade=CascadeType.MERGE
,在第一个示例中,我只需将save替换为MERGE:
FirstEntity firstEntity = mapper.toEntity(firstDto);
if(firstDto.getSecond() != null) {
firstEntity.getSecond().setFirst(first);
}
firstRepository.merge(firstEntity);
这将持久化新的FirstEntity实例,然后合并第二个实体
请记住,如果要在合并后对第一个实体执行任何操作,则必须处理新实例:
FirstEntity mergedFirstEntity = firstRepository.merge(firstEntity);
// operations on mergedFirstEntity from now on
非常感谢,我从来没有想过这么简单的事情:哦