我是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 –