2016-09-20 100 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