我是Spring Data / Hibernate的新手,我试图了解你应该如何处理并发用户访问数据。
假设我有一个非常简单的领域模型,包括房屋和住在这些房子里的人:
行:
@Entity
public class House {
@Id
@GeneratedValue
private Long id;
@OneToMany(cascade = CascadeType.ALL)
private Set<Person> persons;
public void addPerson(Person p) {
persons.add(p);
public Set<Person> getPersons() {
return persons;
}
}
人:
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
}
目前我正在从HouseRepository加载一个House,并使用此对象来获取/添加人员。
对于单个用户来说一切正常,但是你应该如何支持并发用户呢?也就是说,我说有一个拥有2个并发用户的Web应用程序,他们都希望查看和添加/编辑来自同一个房子的人。
标准/最佳做法是什么?
编辑:澄清我想做的事情:
编辑:@Transactional的问题 -
@SpringBootApplication
public class ExampleApplication implements CommandLineRunner {
@Autowired
private HouseRepository houseRepository;
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
@Override
public void run(String... strings) throws Exception {
House house = new House();
Person person = new Person();
person.setName("Bob");
house.addPerson(person);
houseRepository.save(house);
printPeople(house.getId());
}
@Transactional
public void printPeople(Long id) {
House house = houseRepository.findOne(id);
for (Person person : house.getPersons()) {
System.out.println(person.getName());
}
}
}
抛出org.hibernate.LazyInitializationException:懒得初始化一个角色集合:com.example.House.persons,无法初始化代理 - 在printPeople的foreach循环中没有Session
答案 0 :(得分:0)
通常希望在交易中使用JPA。使用Spring的@Transactional
AOP来标记您的事务边界,它将处理并发访问。将@Transactional
应用于相关的最高级方法,这通常是Web应用程序的MVC控制器方法。