1. 程式人生 > >springboot上使用hibernate報錯總結

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