我有一个用例,它调用以下内容:
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public UserControl getUserControlById(Integer id){
return this.userControlRepository.getOne(id);
}
Run Code Online (Sandbox Code Playgroud)
观察@Transactionalhas Propagation.REQUIRES_NEW,存储库使用getOne.当我运行该应用程序时,收到以下错误消息:
Exception in thread "main" org.hibernate.LazyInitializationException:
could not initialize proxy - no Session
...
Run Code Online (Sandbox Code Playgroud)
但是,如果我改变getOne(id)的findOne(id)一切工作正常.
顺便说一下,就在用例调用getUserControlById方法之前,它已经调用了insertUserControl方法
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public UserControl insertUserControl(UserControl userControl) {
return this.userControlRepository.save(userControl);
}
Run Code Online (Sandbox Code Playgroud)
两种方法都是Propagation.REQUIRES_NEW,因为我正在进行简单的审计控制.
我使用该getOne方法,因为它是在JpaRepository接口中定义的,我的Repository接口从那里扩展,我当然正在使用JPA.
该JpaRepository接口扩展自CrudRepository.该findOne(id)方法定义于CrudRepository.
我的问题是:
getOne(id)方法?getOne(id)方法?我正在使用其他存储库并且所有使用该getOne(id)方法并且所有工作正常,只有当我使用Propagation.REQUIRES_NEW …
有这样的课程:
用户.java:
@Entity
@Setter
@Getter
@NoArgsConstructor
public class User {
@Id
private int id;
private String username;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Address address;
public User(String username) {
this.username = username;
}
}
Run Code Online (Sandbox Code Playgroud)
地址.java:
@Entity
@Data
public class Address {
@Id
private int id;
private String country;
@OneToOne
private User user;
}
Run Code Online (Sandbox Code Playgroud)
用户存储库.java:
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}
Run Code Online (Sandbox Code Playgroud)
演示应用程序.java:
@Bean
public CommandLineRunner loadData(UserRepository userRepo){
return new CommandLineRunner() {
@Override
public …Run Code Online (Sandbox Code Playgroud)