I met today very strange problem. I try to rewrite my synchronous service to reactive asynchronous service.
The problem is I get LazyInitializationException but I don't get this exception when I don't use RxJava.
Here I don't get exception:
@Override
@Transactional
public User addOrder(String username, Order order) {
if (username != null && order!= null) {
final User user = userRepository.findByUsername(username);
if (user != null) {
user.getOrders().add(order);
order.setUser(user);
try {
return userRepository.save(user);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}
In this method I get LazyInitializationException:
@Override
@Transactional
public Observable<User> addOrderAsynchronously(String username, Order order) {
if (username != null && order != null) {
return Observable
.fromCallable(() -> userRepository.findByUsername(username))
.filter(Objects::nonNull)
.map(user -> {
synchronized (this) {
user.getOrders().add(order); // I get here LazyInitializationException
order.setUser(user);
}
return user;
})
.map(userRepository::save);
}
return Observable.empty();
}
The collection orders associated to user looks:
@OneToMany(
mappedBy = "user",
cascade = { CascadeType.PERSIST, CascadeType.MERGE }
)
private Collection<Order> orders = new ArrayList<>();
I map this list as Collection
because Hibernate doesn't need to initialize a Collection types.
What is the problem?