希望大家根据实际情况玩得开心。由于我找不到我的问题的答案,所以我将此作为一个新问题提出。我目前正在开发一个可用于管理的应用程序。但是,当我进行一些实验时,我发现了一些奇怪的行为。请注意,我不会做您在生产代码中看到的一些事情。但是,我想深入了解并更好地了解我正在使用的框架。现在,让我向您展示一些代码:
1. 实体的相关部分:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean wareGroupMain;
private String name;
@OneToMany(mappedBy="whg",cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
private Set<Medicine> whgmedicines = new HashSet<Medicine>();
@ManyToOne(cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
@JoinColumn(name="whg_id")
private WHG mainGroup;
@OneToMany(mappedBy="mainGroup", cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
private Set<WHG> subGroups = new HashSet<WHG>();
2. 存储库的相关部分
@Repository
public interface WHGRepository extends JpaRepository<WHG,Long>{
List<WHG> findAll();
3. 服务的相关部分
@Service
public class WHGService {
@Autowired
WHGRepository whgRepository;
public List<WHG> findWHG() {
List<WHG> allWHG = whgRepository.findAll();
List<WHG> result = new ArrayList<WHG>();
Stream<WHG> whgStream = allWHG.stream();
whgStream.forEach((whg) -> {
if (whg.isWareGroupMain()) {
result.add(whg);
}
});
whgStream.close();
return result;
}
public void save(WHG whg) {
whgRepository.save(whg);
}
4. 组件的相关部分
private List<WHG> allwhg;
public void testIinit() {
testInsert();
allwhg=whgService.findWHG();
. . . //如果我现在尝试访问 allwhg 的 whg,则所描述的问题发生在此类中的任何位置
. . .
public void testInsert() {
WHG whg = new WHG();
whg.setName("Med1");
whg.setIcon(Icon.MEDKIT);
whg.setWareGroupMain(true);
WHG wug = new WHG();
wug.setName("Med2");
wug.setIcon(Icon.DRINK2);
wug.setWareGroupMain(true);
WHG wag = new WHG();
wag.setName("Med3");
wag.setIcon(Icon.CUBES);
wag.setWareGroupMain(false);
WHG wig = new WHG();
wig.setName("Med4");
wig.setIcon(Icon.BOLT);
wig.setWareGroupMain(false);
wag.setMainGroup(wug);
wig.setMainGroup(wag);
whgService.save(wig);
whgService.save(whg);
whgService.save(wug);
whgService.save(wag);
. . .
如果没有足够的代码给你,请告诉我你需要什么,我会很乐意添加它。组件中发生的事情是我调用 save() 向自己插入一些测试数据,然后从数据库中“加载”它。如果我稍后现在调用 whg.getSubgroups() (我检索的对象之一)它是空的。这非常有趣,因为它 1)应该有内容,2)我想我记得 hibernate 可能会返回一个空集合但不是 null ......
那么问题来了,为什么whg.getSubgroups()在调用 save() 再调用 findAll() 时为 null?此外,如果您重复上面显示的插入方法,现在将正确检索前三个实体(我们之前遇到空问题的实体)。但是,现在新保存和获取的实体存在 null 问题。这重复直到无穷大(它仍然正确保存在数据库中)。
我希望我能把我的问题说清楚,如果没有,请告诉我。我花了很多时间来做一些可能真的微不足道的事情,但我没有得到它,而且我在互联网上找不到回答我的问题的地方。
我真的很期待您的有用回答!
最良好的祝愿, foAW