我是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,并使用这个对象来获取/添加人员。
这一切都适用于单个用户,但你应该如何支持并发用户?也就是说,我有一个有两个并发用户的Web应用程序,他们都想查看和添加/编辑来自同一家的人。
什么是标准/最佳实践?
编辑:澄清我想要做什么:
- 用户1从库中获取houseA
- 用户2从库中获取houseA
- 用户1添加Persona到houseA
- 用户2从houseA获得人,其中包含personA
编辑:问题与@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,无法初始化代理 - 没有会话在foreach循环中printPeople
根据具体情况,有几种可能的解决方案。替换你的“什么是标准/最佳实践?”问题更具体一个。 –
你可以使用锁 – Kelvin
http://stackoverflow.com/a/19456821/1356423 –