2016-09-20 101 views
0

我是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. 用戶1從庫中獲取houseA
  2. 用戶2從庫中獲取houseA
  3. 用戶1添加Persona到houseA
  4. 用戶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

+0

根據具體情況,有幾種可能的解決方案。替換你的「什麼是標準/最佳實踐?」問題更具體一個。 –

+0

你可以使用鎖 – Kelvin

+0

http://stackoverflow.com/a/19456821/1356423 –

回答

0

JPA一般預計將在交易中使用。使用Spring的@Transactional AOP標記您的事務邊界,它將處理併發訪問。將@Transactional應用於相關的最高級別方法,這通常是Web應用程序的MVC控制器方法。

+0

麻煩是,@Transactional似乎並沒有爲我工作(拋出org.hibernate.LazyInitializationException,請參閱更新的問題)。更改獲取類型的作品,但我寧願不這樣做。 – bobsyouruncle

+0

@bobsyouruncle這是*自我通話*的標準問題。代理AOP(Spring缺省值)只能在容器注入方法調用的接收者時應用,並且在調用'this'時不起作用。將'printPeople'拆分成一個自動裝配的對象,它就可以工作。 – chrylis

+0

是的,乾杯,歡呼聲。就像我說的,我是新來的:) – bobsyouruncle