当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Jpa在保存实体后获取关系不工作

华昕
2023-03-14

我有一个关于spring boot和hibernate的项目。从数据库中选择数据时一切正常,但在插入实体后我遇到了一个问题。插入后未提取实体关系。我尝试了JpaRepository保存并刷新,但没有成功。此外,我还尝试了findById,但没有成功。我如何解决这个问题?

我的实体;

@Entity
@Table(name = "Comment")
@Data
@ApiModel(value = "Comment Model")
public class Comment {

 public static  Comment createCommentFromCommentPostRequest(CommentPostRequest commentPostRequest){
     Comment comment = new Comment();
     comment.setPostId(commentPostRequest.getPostId());
     comment.setUsersId(commentPostRequest.getUsersId());
     comment.setText(commentPostRequest.getText());
     return  comment;
 }

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name = "id")
 @ApiModelProperty(value = "Comment model autogenerated Id value")
 private Long id;

 @Column(name = "usersId",nullable = false)
 @ApiModelProperty(value = "User Id for describe who commented post")
 private Long usersId;

 @Column(name = "postId",nullable = false)
 @ApiModelProperty(value = "Post Id for describe which post commented")
 private Long postId;

 @Column(name = "text",length = 500)
 @ApiModelProperty(value = "define post content")
 private String text;

 @ManyToOne(fetch = FetchType.EAGER)
 @Fetch(FetchMode.JOIN)
 @JoinColumn(name = "usersId",insertable = false,updatable = false,nullable = false)
 private Users users;

 @ManyToOne(fetch = FetchType.EAGER)
 @JoinColumn(name = "postId",insertable = false,updatable = false,nullable = false)
 @JsonIgnore
 @OnDelete(action = OnDeleteAction.CASCADE)
 private Post post;
}

我的存储库;

public interface CommentRepository extends PagingAndSortingRepository<Comment,Long> {
    List<Comment> findAllByPostId(Long postId, Pageable pageable);
}

我的服务方式;

public Comment saveOneComment(CommentPostRequest commentPostRequest) {
        //TODO: implement validation
        Comment commentToSave = Comment.createCommentFromCommentPostRequest(commentPostRequest);
        commentToSave= commentRepository.save(commentToSave);
        //I tried JPA repository saveAndFlush 
        return commentRepository.findById(commentToSave.getId()).orElse(null);
    }

我的控制器;使用saveOneCommentendpoint


@RestController
@RequestMapping("/api/comment")
@ApiOperation(value = "Comment api controller")

public class CommentController {

    CommentService commentService;

    public CommentController(CommentService commentService) {
        this.commentService = commentService;
    }

    @GetMapping("/{pageNo}/{pageSize}")
    public List<Comment> getAllComments(@PathVariable int pageNo,@PathVariable int pageSize){

        return Streamable.of(commentService.getAllComments(pageNo,pageSize)).toList();
    }

    @GetMapping("/{commentId}")
    public Comment findCommentById(@PathVariable Long commentId){
        return commentService.findById(commentId);
    }

    @GetMapping("/postId={postId}/{pageNo}/{pageSize}")
    public List<CommentResponse> getAllCommentsByPostId(@PathVariable Long postId,@PathVariable int pageNo,@PathVariable int pageSize){
        return commentService.getAllCommentsByPostIdAsCommentResponse(postId,pageNo,pageSize);
    }

    @PostMapping
    public Comment saveOneComment(@RequestBody CommentPostRequest commentPostRequest){

        return commentService.saveOneComment(commentPostRequest);
    }

    @PutMapping("/{commentId}")
    public Comment putOneComment(@PathVariable Long commentId,@RequestBody CommentPostRequest commentPostRequest){
        return commentService.putOneCommentById(commentId,commentPostRequest);
    }

    @DeleteMapping("/{commentId}")
    public void deleteOneComment(@PathVariable Long commentId){
        commentService.deleteById(commentId);
    }
}

Comment(id=32, usersId=2, postId=2, text=ddwad, user=null, post=null)再次插入并查找后,用户和post为空。当我运行getAllCommentsByPostId方法时一切正常。

插入后,仅在控制台中插入查询。select语句没有任何查询。

 insert 
    into
        Comment
        (postId, text, usersId) 
    values
        (?, ?, ?)

共有1个答案

邵畅
2023-03-14

您必须在提交事务后重新加载对象,我的意思是在事务外部维护关系

  @PostMapping
 public Comment saveOneComment(@RequestBody CommentPostRequest commentPostRequest){
      
             Long id= commentService.saveOneComment(commentPostRequest);
        return commentService.loadCommentById(id);
    }
    ````
 类似资料:
  • 此代码崩溃: 原因:组织。postgresql。util。PSQLException:错误:关系“订阅”不存在 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect Springjpa。数据库平台=组织。冬眠地方话PostgreSQL10方言Spring。jpa。冬眠ddl auto=创建拖放

  • 属性: 这是(Spring): 通过一个REST控制器和一个JSON,我想创建一个新的: 输出JSON: 我希望它们在保存操作之后被验证/返回。 要解决此问题,我必须在REST控制器中注入/声明,并调用方法(或者我必须调用方法以获得完整的持久化实体): 是否有一个自动的方法/注释,使用JPA或Spring或Hibernate,以便拥有“完整的”持久化实体? 我希望避免在每个REST或服务类中声明,

  • 我试图使用spring JPA repository和entity graph加载实体的惰性属性,EntityGraph不是动态获取提供的关系,而是根据entity中为该属性定义的静态获取类型获取属性。 使用hibernate-5.2.17.Final,Spring-4.3.20.RELEASE,Spring数据JPA-1.11.22.RELEASE

  • 我有2个实体(我删除了无用的字段): 而且 这似乎符合我的情况(也是我当前的实现),但它不起作用。 我得到以下错误消息: 来自MySQL: 临时解决方案是从存储库中检索所有相应的权限(按permissionName搜索)。那么保存效果很好。逻辑上是正确的,但我希望有一个更简单的程序...

  • 保存“我的实体”时,通过关系工作的子实体不会保存到它们的表中。我不明白怎么回事。 员工: EmployeePhoneNumber: 如何设置这些字段,然后保存实体: 在完成该方法后,我没有一个错误,所有的工作都是正确的,只是表格没有填满--为什么?

  • 在使用hibernate和jpa的spring mvc项目中,我有一个实体和一个实体。每个可以有许多,但每个只能有一个。如何为现有的保存新的? 我读过很多关于这个的帖子。如果我试图保存新的,就会出现无法保存分离实体的错误。但如果我试图保存现有的,则不会保存该角色。我读了这篇帖子,建议将hibernate注释移动到getter,但当我这样做时,我会收到一个引用未知属性的hibernate映射错误。这