今天使用springboot整合spring-data-jpa遇到一些問題,直接使用JpaRepository的getOne()方法是會報錯的。報錯信息為:org.hibernate.LazyInitializationException: could not initialize proxy - no Session。在SpringBoot1.xx版本應該使用findOne()方法根據主鍵來查找對象。
這里是findOne和getOne的區別:
getOne API:返回對具有給定標識符的實體的引用。當我查詢一個不存在的id數據時,直接拋出異常,因為它返回的是一個引用,簡單點說就是一個代理對象。
findOne API:按ID查找實體。當我查詢一個不存在的id數據時,返回的值是null.
詳細對比參考這里。
但是新版本的JPA中,已經不存在用ID查找實體的findOne方法了,取而代之的是:findById().get()方法。
spring配置如下:
spring: datasource: username: root password: 123456 url: jdbc:mysql://172.16.80.34:3307/jpa?useUnicode=true&characterEncoding=UTF8 driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: # 更新數據表結構 ddl-auto: update show-sql: true open-in-view: true
實體類:
package com.wang.springboot06jap.entity; import javax.persistence.*; //使用JPA注解配置映射關系 @Entity @Table(name = "tbl_user") //配置表名,若省略則默認表名是user public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) //自增主鍵 private Integer id; @Column(name = "lastName",length = 20) //若省略就是屬性名 private String username; private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
Reposity:
public interface UserRepository extends JpaRepository<User,Integer> { }
調用JPAReposity的方法:
@Controller
public class UserController {
@Autowired
UserRepository userRepository;
@GetMapping("/user/{id}")
@ResponseBody
public User getUser(@PathVariable("id") Integer id){
User user = userRepository.findById(id).get();
// System.out.println(userRepository.getOne(id));
//
return user;
}
}