繁体   English   中英

Spring JPA数据的存储库

[英]Spring JPA Data's Repository

我正在尝试使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异常。

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

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

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

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

谢谢。 武东

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

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

class Card{
@ManyToOne
private User user;
}

以及如何调用someMethod 如果在初始化方法中调用它,则将无法使用@Transactional

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM