首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring数据仓库

Spring数据仓库
EN

Stack Overflow用户
提问于 2012-06-13 21:56:18
回答 1查看 1.4K关注 0票数 1

我试图使Spring数据为我工作,但一直在挣扎。这就是问题所在。

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

代码语言:javascript
复制
class Card {
    @ManyToOne(mappedBy="user")
    private User user;
}

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

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

代码语言:javascript
复制
@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()出现了问题,其中我询问了一个用户的标识符,然后尝试获取映射@OneToMany的列表,然后发生了LazyInitialization异常。

我不确定我是不是漏了什么东西?似乎只要返回了存储库的方法,实体管理器就关闭了;如果是这样的话,我想知道如何在不定义另一个存储库方法的情况下得到这种关系?

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

存储库的delete()似乎也有问题。如果我先删除一张卡,然后尝试删除()其拥有的用户(它的列表中还有卡片),删除将失败,抱怨找不到卡。但我没有设置任何删除传播从用户到卡!

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

谢谢。乌东

EN

回答 1

Stack Overflow用户

发布于 2012-06-14 05:13:18

首先,需要交换映射标记,即

代码语言:javascript
复制
class User(){
 @OneToMany(mappedBy="user")
 private List<Card> cards;
}

class Card{
@ManyToOne
private User user;
}

你是怎么称呼你的someMethod的?如果在init-方法中调用它,则无法使用@Transactional

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11023907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档