Я некоторое время искал в Интернете и теперь знаю, что получаю исключение, потому что сеанс, который использовался для загрузки класса который содержит коллекцию, закрыт.
Однако решения я не нашел (или по крайней мере я его не понял). В основном у меня есть следующие классы:
Пользователь
Код: Выделить всё
@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 {}
Код: Выделить всё
@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());
}
}
Может кто-нибудь указать подскажите, как это сделать?
P.S. Я хочу использовать отложенную загрузку, поэтому быстрая загрузка невозможна.
Подробнее здесь: https://stackoverflow.com/questions/265 ... g-data-jpa
Мобильная версия