hibernate持久化嵌套注解时出现的问题

gfttwv5a  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(373)

我正在尝试使用springboot和user、userentity、post、comment实体创建一个简单的crud应用程序。
->userentity是comment和post的超类。
->每个评论都与一个userentity(可以是post或其他评论)有多个one关系
用户实体
   |
   @多酮
   createdby-引用用户表(id)
   |

sg2wtvxw

sg2wtvxw1#

|        |
|        |
岗位   评论
        |
        @多对一
          userentity-引用user\实体表的pk(实体\ id),因为评论可以发布或回复到另一个评论
在试图保存commentservice类的评论时,

//Controller
@PostMapping(path = "api/v1/addComment")
public void addComment(@RequestBody Comment comment){ commentService.addCommentOnPost(comment); }

//Service
public void addCommentOnEntity(Comment comment){ commentRepos.save(comment); }

注解表(父实体id)中的外键引用用户实体表中的实体id,但未更新。值为空。
另一方面,userentity与user有一个manytone关系createdby,它正确地更新user\u entity表中的外键user\u id
有人能告诉我哪里有问题吗?我从昨天晚上就开始试了,但是运气不好。已经检查了一些其他的答案,但是无法得到这个案例的答案。
用户.java

@Entity
@Table(name="[user]")
public class User {
    @Id
    @SequenceGenerator(name="student_sequence",
    sequenceName = "student_sequence",
    allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
    generator = "student_sequence")
    private long id;
    private String name;
    private  String email;
    private int age;
    private LocalDate DOB;
//Setters and Getters and default constructor
}

用户实体.java

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class UserEntity {

    @Id
    @SequenceGenerator(sequenceName = "entity_sequence", name="entity_sequence", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "post_sequence")
    private long entityId;
    private char entityType;
    private LocalDate createdOn;
    private LocalDate modifiedOn;
    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private User createdBy;
//Setters and Getters and default constructor
}

后java

@Entity
public class Post extends UserEntity{

    private String postHeading;
    private String postBody;
//Setters and Getters and default constructor
}

注解.java

@Entity
public class Comment extends UserEntity{

    private String comment;
    @ManyToOne
    @JoinColumn(name="parent_entity_id", referencedColumnName = "entityId")
    private UserEntity parentEntity;
//Setters and Getters and default constructor
}

以及他们的存储库

@NoRepositoryBean
public interface UserEntityBaseRepos<T extends UserEntity> extends JpaRepository<T, Long>{
        Optional<List<T>> findByCreatedBy_Id(Long user_id);
        Optional<List<T>> findByEntityId(Long entity_id);
}

@Repository
public interface UserRespository extends JpaRepository<User, Long> {
    Optional<User> findUserByEmail(String email);
    Optional<User> findUserByName(String name);
}

@Repository
public interface PostRepos extends UserEntityBaseRepos<Post>, JpaRepository<Post, Long> {

}

@Repository
public interface CommentRepos extends UserEntityBaseRepos<Comment>, JpaRepository<Comment, Long> {

}

postcomment服务的json

{
    "entityType" : "C",
    "createdOn" : "2020-02-05",
    "createdBy" : {
        "id" : 1
    },

    "comment": "I am the comment",
    "parentEntity" : {
        "entityId" : 1
    }
}
//User with id = 1 and UserEntity(Post) with entityId = 1 available in database.
Here createdBy.id (user id) is getting updated in the user_entity table, but userEntity.entityId is not getting updated in the comment table
xu3bshqb

xu3bshqb2#

你有非常复杂的实体关系,在我看来。。。
不管怎样,我发现你加了一个 generator 财产 UserEntity 具有 post_sequence 价值,但我找不到与 Post 数据库中的实体。这可能就是崩溃的原因。你必须连接 UserEntityPost 如图所示或更改生成器值。

yptwkmov

yptwkmov3#

我能解决这个问题。这个问题出现在comment具体类的下面一段代码中

@ManyToOne
    @JoinColumn(name="parent_entity_id", referencedColumnName = "entityId")
    private UserEntity parentEntity;

这个json输入

"parentEntity" : {
        "entityId" : 1
    }

似乎json输入中的parententity没有被解析。在正确解析json输入时,将jsonproperty(“parententity”)放在parententity上方就解决了这个问题。
然而,还有另一个问题。parententity未反序列化为userentity,因为userentity是抽象类。我不得不使用jacksonpolymorphicdeserialization,通过引入一个新的字段parenttype(“p”表示post,“c”表示comment)以及一些注解(如下所示),将parententity反序列化为相应的具体类对象。

public class Comment extends UserEntity{
    private String comment;
    @Transient
    @JsonProperty("parentType")
    private char parentType;
    @ManyToOne
    @JoinColumn(name="parent_entity_id", referencedColumnName = "entity_id", foreignKey = @ForeignKey(value=ConstraintMode.CONSTRAINT))
    @JsonProperty("parentEntity")
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME , property = "parentType", include = JsonTypeInfo.As.EXTERNAL_PROPERTY)
    @JsonSubTypes(value = {
            @JsonSubTypes.Type(value = Comment.class, name = "C"),
            @JsonSubTypes.Type(value = Post.class, name = "P")
    })
    private UserEntity parentEntity;

引用-通过字段进行多态反序列化。我不太清楚这是怎么回事。我会尽力理解并更新答案。
如果有人知道反序列化json的更好方法,一定要在评论中提及,或者作为一个新的答案。

相关问题