Spring Data

时间:2016-09-20 04:07:47

标签: java hibernate spring-data spring-data-jpa

我是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,并使用此对象来获取/添加人员。

对于单个用户来说一切正常,但是你应该如何支持并发用户呢?也就是说,我说有一个拥有2个并发用户的Web应用程序,他们都希望查看和添加/编辑来自同一个房子的人。

标准/最佳做法是什么?

编辑:澄清我想做的事情:

  1. 用户1从存储库中获取houseA
  2. 用户2从存储库中获取houseA
  3. 用户1将personA添加到houseA
  4. 用户2从houseA获取人员,其中包含personA
  5. 编辑:@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

1 个答案:

答案 0 :(得分:0)

通常希望在交易中使用JPA。使用Spring的@Transactional AOP来标记您的事务边界,它将处理并发访问。将@Transactional应用于相关的最高级方法,这通常是Web应用程序的MVC控制器方法。