簡體   English   中英

使用Spring Data進行並發數據訪問

[英]Concurrent data access with Spring Data

我是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加載房屋,並使用此對象來獲取/添加人員。

所有這些對於單個用戶都可以正常工作,但是您應該如何支持並發用戶呢? 也就是說,假設我有一個Web應用程序,該應用程序有2個並發用戶,這兩個用戶都希望查看和添加/編輯來自同一房屋的人員。

什么是標准/最佳實踐?

編輯:闡明我想做什么:

  1. 用戶1從存儲庫獲取houseA
  2. 用戶2從存儲庫獲取houseA
  3. 用戶1將personA添加到houseA
  4. 用戶2從houseA獲取人員,其中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,無法初始化代理-printPeople中的foreach循環處沒有Session

通常希望在事務內使用JPA。 使用Spring的@Transactional AOP標記您的事務邊界,它將處理並發訪問。 @Transactional應用於相關的最高級別方法,該方法通常是Web應用程序的MVC控制器方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM