Spring JPA Data Repository

时间:2012-06-13 21:56:19

标签: java spring jpa spring-data spring-data-jpa

我正在尝试让Spring JPA Data为我工作,但一直在努力。这是问题所在。

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

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

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

我为每个类设置了Repository接口:CardRepository,扩展JpaRepository的UserRepository,两个存储库都注入服务

@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的抓取是急切的,没问题,但这是我真的不想做的事情。

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

我希望有人可以解释如何在JpaRepository中使用entitymanager,它似乎使Jpa编程更加困难。我知道所有的存储库都是自动生成的,但是如果有人可以指出它们的实现方式会非常有用。

感谢。 武

1 个答案:

答案 0 :(得分:0)

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

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

class Card{
@ManyToOne
private User user;
}

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