使用MapsId映射的OneToOne关系时,findAll()方法不返回最近插入的记录

Jadda:

我有两个名为Post和PostDetails的实体类。两者都使用MapsId并共享主键与OneToOne关系进行映射,如下所示。

Post.java

@Entity
@Table(name = "post")
@Data
public class Post implements Serializable
{
    private static final long serialVersionUID = -6698422774799518217L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NaturalId
    @Column(name = "title")
    private String title;

    @OneToOne(mappedBy = "post", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    private PostDetail detail;

}

PostDetail.java

@Entity
@Table(name = "post_detail")
@Data
public class PostDetail implements Serializable
{
    private static final long serialVersionUID = -6699482774799518217L;

    @Id
    private Long id;

    @Column(name = "created_on")
    private Date createdOn;

    @Column(name = "created_by")
    private String createdBy;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    @JoinColumn(name = "id")
    @JsonIgnore
    private Post post;

}

PostController.java

@RestController
@RequestMapping("/api/v1/post")
public class PostController
{
    private final PostRepository postRepository;

    private final PostDetailRepository postDetailRepository;

    public PostController(PostRepository postRepository, PostDetailRepository postDetailRepository)
    {
        this.postRepository = postRepository;
        this.postDetailRepository = postDetailRepository;
    }

    @GetMapping(path = "/create")
    public List<Post> createAndGetPosts()
    {

        Post post=new Post();
        post.setId(new Random().nextLong());
        post.setTitle("First Post");
        post=postRepository.saveAndFlush(post);

        PostDetail postDetail =new PostDetail();
        postDetail.setCreatedBy("Admin");
        postDetail.setCreatedOn(Date.from(Instant.now()));
        postDetail.setPost(post);
        postDetailRepository.saveAndFlush(postDetail);

        return postRepository.findAll(Sort.by(Sort.Direction.DESC,"id"));
    }


}

在Post Controller类中,我创建Post对象(将其保存为DB),然后将其传递给PostDetail对象,然后使用Spring Data JPA将其保存到数据库中。一切正常。但是,当我立即获取记录列表时,通过postRepository.findAll(Sort.by(Sort.Direction.DESC,"id"));方法我将null在Post内接收PostDetail对象的值,如下所示。

响应:

[
  {
    "id": 2,
    "title": "First Post",
    "detail": null
  },
  {
    "id": 1,
    "title": "Post1",
    "detail": {
      "id": 1,
      "createdOn": "2019-06-21T03:31:43.000+0000",
      "createdBy": "Admin"
    }
  }
]

但是,当我再次从前端向列表发送请求时,我得到了正确的响应。我试图将flush语句和第二个findAll()语句放在请求之前,但没有任何效果。

talex:

发生这种情况是因为您收到了与从变量返回saveAndFlush并存储在post变量中的实例完全相同的实例

Hibernate不更新Post.detail当你这样做postDetail.setPost(post)

要修复它,您可以在保存后detail手动设置Post从缓存中退出实例,这会迫使休眠状态从数据库重新加载它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用@MapsId时,SQL INSERT中缺少JPA OneToOne关系FK,因此Hibernate抛出“列不允许使用NULL”

使用@ManyToOne映射时未插入记录

查找多个记录时,Cypher查询不返回关系

如何使用 YAML 映射 OneToOne 关系

双向@OneToOne映射使用休眠创建记录

防止在春季休眠时使用OneToOne关系在父表中插入空值

为什么在插入记录时使用返回 ID

Spring Data JPA - findAll 不返回关系数据

如何正确映射OneToOne关系?

使用@EmbeddedId和@MapsId会导致插入NULL(不违反NULL约束)

如何使用口才(Laravel)关系插入记录?

与@MapsId双向@OneToOne级联

JPA OneToOne关系返回null

映射对象值时不返回分配

返回最近24小时内计数的记录

与组匹配时,为什么findall不返回整个匹配?

如何构造一个接受最近插入记录的SQLAlchemy关系?

插入,更新或删除记录时返回记录的ID

如何使用MERGE的“不匹配时”在同一张表中插入新记录?

控制器映射是在启动时不记录

使用SELECT返回最近6个月的记录

使用Sqlite Flutter BETWEEN查询返回最近2天的记录

关于OneToOne关系的EclipseLink PreUpdate不持久

使用LINQ,为什么只有一条记录时GroupBy不返回任何行?

使用 model.find 时,活动记录不返回特定列

Spring Boot无法使用findAll或findByColumnName方法获取关系实体

Beautifulsoup“ findAll()”不返回标签

BeautfulSoup findAll 不返回结果

错误:类型不匹配 - 如何使用 spring-mvc 表单持续休眠双向 OneToOne 映射