hibernate_映射大字段(圖片,長文本等)

示例程序, 保存一張圖片到mysql 數據庫, 然後進行讀取:

	@Before
	public void testSave() throws Exception{
		Session session = HibernateUtil.getInstance().getSession();
		session.beginTransaction();
		
		BlobObj obj = new BlobObj();
		File file = new File("C:\\Users\\Jack\\Workspaces\\MyEclipse 2016 CI\\hibernate\\huangmengdan.jpg");
		FileInputStream fis = new FileInputStream(file);
		//在hibernate3.5:
		//Hibernate.createBlob(InputStream);
		//session.getLobHelper(): 得到一個大字段創建助手
		obj.setImg(session.getLobHelper().createBlob(fis, file.length()));
		session.save(obj);
		
		session.getTransaction().commit();
		fis.close();
		session.close();
	}
	
	@Test
	public void testGet() throws Exception{
		Session session = HibernateUtil.getInstance().getSession();
		
		BlobObj blobObj = session.get(BlobObj.class, 1L);
		Blob blob = blobObj.getImg();
		
		File file = new File("C:\\Users\\Jack\\Workspaces\\MyEclipse 2016 CI\\hibernate\\women.jpg");
		FileOutputStream fos = new FileOutputStream(file);
		InputStream is = blob.getBinaryStream();
		int len = 0;
		byte[] buf = new byte[1024];
		while((len=is.read(buf)) > 0){
			fos.write(buf, 0, len);
		}
		fos.flush();
		fos.close();
		is.close();
		
		session.close();
	}

如果你用的mysql 驅動是5.0.8 及以下版本, 這句代碼session.getLobHelper().createBlob(fis, file.length()) 會報一個異常:

java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V is abstract

原因: hibernate3.5 以上版本對Blob 的創建方法進行了改動.

解決方案: 下載mysql 最新的驅動程序, 替換即可.


下面介紹大對象類型在java, sql, hibernate 中對應的類型:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章