Как разрешить LazyInitializationException в Spring Data JPA?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как разрешить LazyInitializationException в Spring Data JPA?

Сообщение Anonymous »

У меня есть два класса, которые имеют отношение один ко многим. Когда я пытаюсь получить доступ к лениво загруженной коллекции, я получаю исключение LazyInitializationException.
Я некоторое время искал в Интернете и теперь знаю, что получаю исключение, потому что сеанс, который использовался для загрузки класса который содержит коллекцию, закрыт.
Однако решения я не нашел (или по крайней мере я его не понял). В основном у меня есть следующие классы:
Пользователь

Код: Выделить всё

@Entity
@Table(name = "user")
public class User {

@Id
@GeneratedValue
@Column(name = "id")
private long id;

@OneToMany(mappedBy = "creator")
private Set createdJobs = new HashSet();

public long getId() {
return id;
}

public void setId(final long id) {
this.id = id;
}

public Set getCreatedJobs() {
return createdJobs;
}

public void setCreatedJobs(final Set createdJobs) {
this.createdJobs = createdJobs;
}

}
Репозиторий пользователей

Код: Выделить всё

public interface UserRepository extends JpaRepository {}
Пользовательская служба

Код: Выделить всё

@Service
@Transactional
public class UserService {

@Autowired
private UserRepository repository;

boolean usersAvailable = false;

public void addSomeUsers() {
for (int i = 1; i < 101; i++) {
final User user = new User();

repository.save(user);
}

usersAvailable = true;
}

public User getRandomUser() {
final Random rand = new Random();

if (!usersAvailable) {
addSomeUsers();
}

return repository.findOne(rand.nextInt(100) + 1L);
}

public List getAllUsers() {
return repository.findAll();
}

}
Работа

Код: Выделить всё

@Entity
@Table(name = "job")
@Inheritance
@DiscriminatorColumn(name = "job_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Job {

@Id
@GeneratedValue
@Column(name = "id")
private long id;

@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User creator;

public long getId() {
return id;
}

public void setId(final long id) {
this.id = id;
}

public User getCreator() {
return creator;
}

public void setCreator(final User creator) {
this.creator = creator;
}

}
Репозиторий вакансий

Код: Выделить всё

public interface JobRepository extends JpaRepository {}
JobService

Код: Выделить всё

@Service
@Transactional
public class JobService {

@Autowired
private JobRepository repository;

public void addJob(final Job job) {
repository.save(job);
}

public List getJobs() {
return repository.findAll();
}

public void addJobsForUsers(final List users) {
final Random rand = new Random();

for (final User user : users) {
for (int i = 0; i < 20; i++) {
switch (rand.nextInt(2)) {
case 0:
addJob(new HelloWorldJob(user));
break;
default:
addJob(new GoodbyeWorldJob(user));
break;
}
}
}
}

}
Приложение

Код: Выделить всё

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class App {

public static void main(final String[] args) {
final ConfigurableApplicationContext context = SpringApplication.run(App.class);
final UserService userService = context.getBean(UserService.class);
final JobService jobService = context.getBean(JobService.class);

userService.addSomeUsers();                                 // Generates some users and stores them in the db
jobService.addJobsForUsers(userService.getAllUsers());      // Generates some jobs for the users

final User random = userService.getRandomUser();            // Picks a random user

System.out.println(random.getCreatedJobs());
}

}
Я часто читал, что сеанс должен быть привязан к текущему потоку, но я не знаю, как это сделать с помощью конфигураций Spring на основе аннотаций.
Может кто-нибудь указать подскажите, как это сделать?
P.S. Я хочу использовать отложенную загрузку, поэтому быстрая загрузка невозможна.

Подробнее здесь: https://stackoverflow.com/questions/265 ... g-data-jpa
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»