1

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

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

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

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

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

@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 异常。

我不太确定我是否错过了那里的东西?好像只要repository的方法返回,entitymanager就关闭了;如果是这种情况,我想知道如何在不定义另一个存储库方法的情况下获得关系?

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

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

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

谢谢。武东

4

1 回答 1

0

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

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

class Card{
@ManyToOne
private User user;
}

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

于 2012-06-14T05:13:18.437 回答