gpt4 book ai didi

java - hibernate 拦截器对象内的数据但实体变量下的数据为空 - 无法保存到存储库

转载 作者:行者123 更新时间:2023-12-04 15:03:47 27 4
gpt4 key购买 nike

我刚开始使用 Spring 和 Hibernate,如果我在这里遗漏了一些明显的东西,我深表歉意,但我有点困惑为什么我可以在调试工具下显示的 hibernate_interceptor 对象中看到我的变量的 id 集但对于它之外的同一个变量,它为空。

enter image description here

这来自问题实体和用户实体之间存在的多对多关系,但我注意到这种情况也发生在其他关系中,它阻止我将新行保存到我的连接表中。

public class UserEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "userEntity", cascade = CascadeType.ALL, orphanRemoval = true)
private Collection<QuestionEntity> questionEntities;

@ManyToMany
@JoinTable(
name = "question_favourite",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "question_id"))
private Set<QuestionEntity> questionFavouriteEntity;


public UserEntity(UUID id) {
this.id = id;
}

}

public class QuestionEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;

@Column(name = "title", nullable = false)
private String title;

@Column(name = "creation_date", nullable = false)
private Long creationDate;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)
private UserEntity userEntity;

@ManyToMany(mappedBy = "questionFavouriteEntity")
private Set<UserEntity> userEntities;

public QuestionEntity(UUID id) {
this.id = id;
}

public QuestionEntity(UUID id, String title) {
this.id = id;
this.title = title;
}

}


@Override
public QuestionFavouriteCreateDto favouriteQuestion(UUID userId, QuestionFavouriteCreateDto qf) {

if (questionRepository.findById(qf.getQuestionId()).isPresent()) {
QuestionEntity questionEntity = questionRepository.findById(qf.getQuestionId()).get();
UserEntity userEntity = userRepository.findById(userId).get();

questionEntity.getUserEntities().add(userEntity);
userEntity.getQuestionEntities().add(questionEntity);

userRepository.save(userEntity);

}

return null;
}

非常感谢。

更新

根据@christian 的回答,我理解这似乎是期望的结果,并且我的数据保存问题已在此 other thread here 下得到解决

最佳答案

Hibernate 为您的实体创建代理类以实现延迟加载。代理类只是实体类的子类,它们通过拦截器将所有访问委托(delegate)给在第一次访问尚未加载状态时延迟加载。由于 Hibernate 必须根据 JPA 规范提供对象身份保证,因此您看到的是代理对象而不是真实实体。如果具有特定 ID 的实体与持久性上下文相关联一次,则当该对象由该持久性上下文管理时,它必须始终返回该对象。

所以这个实体是由不同实体的一些懒惰的一对一关联或使用 entityManager.getReference 代理的。当加载 questionFavouriteEntity 的集合关联时,它发现该对象已经是持久性上下文的一部分并使用该对象。

关于java - hibernate 拦截器对象内的数据但实体变量下的数据为空 - 无法保存到存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66513959/

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