Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带序列生成器的Hibernate/JPA持久映射OneTONE_Java_Hibernate_Jpa_Orm - Fatal编程技术网

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

非常感谢,我从来没有想过这么简单的事情:哦