springboot上使用hibernate報錯總結
這兩天在試用hibernate,整合入springboot是沒問題了,但是具體使用就有問題,大部分應該都是下面兩個問題
1、required a bean of type 'org.hibernate.SessionFactory' that could not be found.
2、InvalidDataAccessApiUsageException 和 Write operations are not allowed in read-only mode
看例子程式碼比較容易,百度上面說的都很零散,這裡我暫時使用的是HibernateDaoSupport裡面自帶的方法。
程式碼規範如上,Dao為資料操縱,Service為中間服務關聯Dao和controller,controller為前端與Service的連線,主類為LanSpringTestApplication 。從上往下解釋,注意紅字部分為主要解決上面問題的關鍵
1、LanSpringTestApplication
@EnableJpaRepositories("com.example.lan.dao") // JPA掃描該包路徑下的Repositorie
@EntityScan("com.example.lan.entity") // 掃描實體類
@EnableScheduling
@SpringBootApplication
public class LanSpringTestApplication {
public static void main(String[] args) {
SpringApplication.run(LanSpringTestApplication.class, args);
}
@Bean
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf){
return hemf.getSessionFactory();
}
//或
/*@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
return new HibernateJpaSessionFactoryBean();
}*/
}
完成後將下面的內容新增到application.properties配置檔案中
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
2、ModelController,這個無非就是控制和接收前端請求,要想使用我們寫的方法,宣告即可
@Resource
private TestService testService;
方法對映看具體的使用了,這裡給我這邊的方法
@RequestMapping("/testQuery") @ResponseBody public Map<String,Object> testQuery(@RequestBody String name) { Map<String,Object> m = new HashMap<>(); try { int id = Integer.valueOf(name); List<TestVo> list = (List<TestVo>) voDao.findAll(); System.err.println("sample started. data ="+list); m.put("ok", "查詢成功"); m.put("data",testService.queryUserById(id)); }catch(Exception e) { e.printStackTrace(); logger.info(e.getStackTrace().toString()); m.put("error",e.getStackTrace().toString()); } return m; }
3、DAO相關類
(1)BaseDao:用來繼承類和寫一些共用方法,也可以直接寫到具體Dao中,如果沒有共用的話
@Transactional
public class BaseDao extends HibernateDaoSupport {
@Autowired
public void setSessionFactoryOverride(SessionFactory sessionFactory)
{
super.setSessionFactory(sessionFactory);
}
public SessionFactory initSessionFactory() {
Configuration config = new Configuration().configure();
//讀取hibernate核心配置檔案內容,建立session工廠
return config.buildSessionFactory();
}
}
(2)ModelDao介面宣告方法,ModelDaoImpl實現類
@Repository
@Table(name="userinfo")
@Qualifier("modelDao")
public interface ModelDao{
//查詢
public TestVo getUserById(int id);
}
@Repository("modelDaoImpl")
public class ModelDaoImpl extends BaseDao implements ModelDao{
@PersistenceContext
private EntityManager entityManager;
@Autowired
private SessionFactory factory;
@Override
public TestVo getUserById(int id) {
// TODO Auto-generated method stub
return (TestVo)getHibernateTemplate().get(TestVo.class,id);
}
}
4、TestVo 實體類
@Entity //加入這個註解,就會進行持久化了
@Table(name="userinfo")
public class TestVo {
@Id
@GeneratedValue
private Integer id;
@Column(name="name")
private String name;
//set和get方法省略
}
5、Service相關類
TestService介面宣告方法,TestServiceImpl實現類
public interface TestService {
public TestVo queryUserById(int id);
}
@Service
public class TestServiceImpl implements com.example.lan.service.TestService{
@Autowired
private ModelDaoImpl modelDaoImpl;
@Override
public TestVo queryUserById(int id) {
// TODO Auto-generated method stub
return modelDaoImpl.getUserById(id);
}
}
參考來自:
https://blog.csdn.net/qq_27298687/article/details/77896609
https://blog.csdn.net/violet_echo_0908/article/details/51084884