gpt4 book ai didi

java - Spring JPA 数据存储库

转载 作者:行者123 更新时间:2023-12-01 05:16:53 26 4
gpt4 key购买 nike

我正在努力让 Spring JPA Data 为我工作,但一直在挣扎。问题就在这里。

我有两个域类,它们之间具有简单的 OneToMany 关系:

class Card {
@ManyToOne(mappedBy="user")
private User user;
}

class User {
@OneToMany
private List<Card> cards;
}

我已经为每个类设置了 Repository 接口(interface):CardRepository、UserRepository 扩展了 JpaRepository,这两个存储库都被注入(inject)到服务中

@Service
@Transactional(readOnly = true)
class Service {
@Autowired
CardRepository repo1;
@Autowired
UserRepository repo2;

public void someMethod() {
// make use of the repos
User u=repo2.findByIdentifier("ID1");
List<Card> cards = u.getCards();
//do something with the cards will throw lazyinitialization exception.
}
}

非常基本的设置。问题出在 someMethod() 上,我在其中查询了一个 User 及其标识符,然后尝试获取映射的 @OneToMany 列表,然后发生了 LazyInitialization 异常。

我不太确定我是否错过了什么?看来只要repository的方法返回,entitymanager就关闭了;如果是这样的话,我想知道如何在不定义另一个存储库方法的情况下获得关系?

如果我将 @OneToMany 的获取设置为急切,没问题,但这是我真的不想做的事情。

存储库的delete()似乎也有问题。如果我先删除一张卡,然后尝试删除()其所属用户(列表中仍然有该卡),则删除将失败,提示找不到该卡。但我没有设置从用户到卡的任何删除传播!

我希望有人能解释一下entitymanager是如何在JpaRepository中使用的,这似乎让Jpa编程变得更加困难。我知道所有存储库都是自动生成的,但如果有人能指出它们是如何实现的,那将非常有帮助。

谢谢。乌东

最佳答案

首先,映射标签需要互换,即

class User(){
@OneToMany(mappedBy="user")
private List<Card> cards;
}

class Card{
@ManyToOne
private User user;
}

你如何调用你的 someMethod ?如果在 init-method 中调用它,您将无法使用 @Transactional

关于java - Spring JPA 数据存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11023907/

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