gpt4 book ai didi

java - 当 OneToOne 关系与 MapsId 映射时,findAll() 方法不返回最近插入的记录

转载 作者:行者123 更新时间:2023-11-30 05:35:37 25 4
gpt4 key购买 nike

我有 2 个名为 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 对象(将其保存到数据库),然后将其传递给 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()语句,但没有任何效果。

最佳答案

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

当您执行 postDetail.setPost(post) 时,Hibernate 不会更新 Post.detail

要修复它,您可以手动设置 detail 或在保存后从缓存中逐出 Post 实例,这会强制 hibernate 从数据库重新加载它。

关于java - 当 OneToOne 关系与 MapsId 映射时,findAll() 方法不返回最近插入的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56696621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com