Hibernate – save image into database

To save an image into database, you need to define a table column as blob data type in MySQL, or equivalent binary type in others database. In Hibernate side, you can declare a byte array variable to store the image data.

Download this example – Hibernate-Image-Example.zip

Here’s an Maven project to use Hibernate to save an image into MySQL ‘avatar‘ table.

1. Table creation

An avatar table creation script in MySQL.


CREATE TABLE  `mkyong`.`avatar` (
  `AVATAR_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `IMAGE` blob NOT NULL,
  PRIMARY KEY (`AVATAR_ID`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2. Maven dependency

Add Hibernate and MySQL dependency.

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
  http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mkyong.common</groupId>
  <artifactId>HibernateExample</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>HibernateExample</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    
        <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
        </dependency>
    
        <!-- MySQL database driver -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.9</version>
	</dependency>
	
	<!-- Hibernate framework -->
	<dependency>
		<groupId>hibernate</groupId>
		<artifactId>hibernate3</artifactId>
		<version>3.2.3.GA</version>
	</dependency>
	
	<!-- Hibernate library dependecy start -->
	<dependency>
		<groupId>dom4j</groupId>
		<artifactId>dom4j</artifactId>
		<version>1.6.1</version>
	</dependency>
	
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.1.1</version>
	</dependency>
	
	<dependency>
		<groupId>commons-collections</groupId>
		<artifactId>commons-collections</artifactId>
		<version>3.2.1</version>
	</dependency>
	
	<dependency>
		<groupId>cglib</groupId>
		<artifactId>cglib</artifactId>
		<version>2.2</version>
	</dependency>
	<!-- Hibernate library dependecy end -->
	
  </dependencies>
</project>

3. Avatar Model

Create a model class to store the avatar data. The image data type is array of bytes.

Avatar.java


package com.mkyong.common;

public class Avatar implements java.io.Serializable {

	private Integer avatarId;
	private byte[] image;

	public Avatar() {
	}

	public Avatar(byte[] image) {
		this.image = image;
	}

	public Integer getAvatarId() {
		return this.avatarId;
	}

	public void setAvatarId(Integer avatarId) {
		this.avatarId = avatarId;
	}

	public byte[] getImage() {
		return this.image;
	}

	public void setImage(byte[] image) {
		this.image = image;
	}

}

4. Mapping file

Create a Hibernate mapping file for avatar. The data type for image is binary.

Avatar.hbm.xml


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.mkyong.common.Avatar" table="avatar" catalog="mkyong">
        <id name="avatarId" type="java.lang.Integer">
            <column name="AVATAR_ID" />
            <generator class="identity" />
        </id>
        <property name="image" type="binary">
            <column name="IMAGE" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

5. Hibernate configuration file

Hibernate configuration file to define the database connection and Hibernate mapping file.

hibernate.cfg.xml


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">password</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <mapping resource="com/mkyong/common/Avatar.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

6. Hibernate utility

A Hibernate utility class to get the database connection.

HibernateUtil.java


package com.mkyong.persistence;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure().buildSessionFactory();
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    
    public static void shutdown() {
    	// Close caches and connection pools
    	getSessionFactory().close();
    }

}

7. Run it

Read a file “C:\\mavan-hibernate-image-mysql.gif” and save it into database, later get it from database and save it into another image file “C:\\test.gif“.


package com.mkyong.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.hibernate.Session;
import com.mkyong.persistence.HibernateUtil;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println("Hibernate save image into database");
        Session session = HibernateUtil.getSessionFactory().openSession();
        
        session.beginTransaction();
        
        //save image into database
    	File file = new File("C:\\mavan-hibernate-image-mysql.gif");
        byte[] bFile = new byte[(int) file.length()];
        
        try {
	     FileInputStream fileInputStream = new FileInputStream(file);
	     //convert file into array of bytes
	     fileInputStream.read(bFile);
	     fileInputStream.close();
        } catch (Exception e) {
	     e.printStackTrace();
        }
        
        Avatar avatar = new Avatar();
        avatar.setImage(bFile);
        
        session.save(avatar);
        
        //Get image from database
        Avatar avatar2 = (Avatar)session.get(Avatar.class, avatar.getAvatarId());
        byte[] bAvatar = avatar2.getImage();
        
        try{
            FileOutputStream fos = new FileOutputStream("C:\\test.gif"); 
            fos.write(bAvatar);
            fos.close();
        }catch(Exception e){
            e.printStackTrace();
        }

        session.getTransaction().commit();
    }
}

Done.

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

Leave a Reply

avatar
newest oldest most voted
Binh Thanh Nguyen
Guest
Binh Thanh Nguyen

Thanks, nice post

Hanumantha Rao Talluri
Guest
Hanumantha Rao Talluri

thanks bro i did insert image by help of your code.

cmfchong
Guest
cmfchong

Can anyone advise me whether the code downloaded from this website can be run in Android Studio?
I failed to run it. Is there a way to test the code? Please help. Thanks.

Rohit
Guest
Rohit

cant we implement this hibernate like in this url :

http://www.mkyong.com/spring/maven-spring-hibernate-mysql-example/

what is difference if i implement in the above urls way

AndroidGeek
Guest
AndroidGeek

byte[] bAvatar = avatar2.getImage(); when I retrieve Byte array from Database and trying to create image again on secondary storage. Its not creating any image.

cmfchong
Guest
cmfchong

Hi MKYong,
Why after downloaded the example source code, I cannot load it inside Android Studio 1.2.2?
Please advise and help. Thanks.

Roopa K
Guest
Roopa K

hi, can somebody help me on how to save/ retrieve image using Java Servlets from MySQL DB in JSP / HTML5 as view

El azote
Guest
El azote

Is there any library or method to save only the reference to the file and keep the data in the fs? I mean, something that handle the directory creation, filenaming and so on.

Thanks

Mohan
Guest
Mohan

I am trying to store the data into mysql using hibernate but i am getting the following exception.

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘data’ at row 1

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2973)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)

at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1129)

at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:681)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1368)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1283)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1268)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)

… 58 more

Jeff
Guest
Jeff

Configuration().configure().buildSessionFactory() is deprecated.

Roshan
Guest
Roshan

Configuration cfg = new Configuration().configure();
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());

cfg.buildSessionFactory(ssrb.build());

riya
Guest
riya

how to save video instead of image…. I did the same but the type in database display tinyblob and because of less space i m not able to save video… POlease suggest

kumar
Guest
kumar

We can use Hibernate.createBlob(new FileInputStream(file2)) and Property mapping as in hbm.Xml file

Bhagyashri
Guest
Bhagyashri

Hello,I am using Oracle 10g and hibernate 4.2.1. I have written DAO as same as that of u but when i map image column as binary…Its gives me following error…”Caused by: java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column” I tried a lot but not getting the point though i know the meaning of error..bt where to change the code nt getting..

Nikopol
Guest
Nikopol

Thank you for this article.

Question:
What if I do not know the image extension when I get it from db? (should I store ext. to? how?)

yasin
Guest
yasin

Awesome example. Thanks a lot.

Mahantesh
Guest
Mahantesh

java.sql.SQLException: Data size bigger than max size for this type: 369881
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java:95)
at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2414)
at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1134)
at oracle.jdbc.driver.OraclePreparedStatement.setBytes(OraclePreparedStatement.java:2170)
at org.hibernate.type.AbstractBynaryType.set(AbstractBynaryType.java:43)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:83)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:60)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1932)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2178)
… 11 more

I am getting above error when i try to insert text file in the database,and i declared it as Blob datatype in oracle 11g,and i ma using hibernate to insert into database

mike
Guest
mike

Exception in thread “main” java.lang.NoClassDefFoundError: javax/transaction/Synchronization
at org.hibernate.impl.SessionImpl.(SessionImpl.java:213)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:473)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:497)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:505)
at com.mkyong.common.App.main(App.java:15)

gives me this error when i try to run app.java

Alex
Guest
Alex

This is a nice tutorial indeed. Though it is a bad practice to keep images or all other files in database but still proves worthy for some small to midsize project when there is no file server available. Here is another short and simple tutorial we have in our website on BLOB and image handling – http://www.techcubetalk.com/2013/05/workshop-developing-mini-photo-gallery-application-using-struts2-hibernate-mysql-blob-part-1/

Kyle Ng
Guest
Kyle Ng

Thanks Myokong, your jpa/hibernate examples are great – you always show step by step instruction which is very useful. I am working on a hibernate project and your examples really help! Please keep posting more examples! By the way, would be great if you can also provide an example for working with Oracle XML column type (XMLType) using hibernate.

amit
Guest
amit

How i can retrive an image using hibernate and display that image on jsf2.0…

Kyle
Guest
Kyle

thank you for this nice tutorial !
but i see that the part //Get image from database, generate the images stored in DB on a disk directory ,which is redundant ,we have two images .
is there a better solution to open the image in a jsf page without creating the image on the disk.

zakaria
Guest
zakaria

Hello mkyong,
i want to save and get a pdf file in data base in stead of image .
what will be the changes to this tutorial !
thx for your help

Vikee
Guest
Vikee

Hi zakaria,Whether this will work for .zip file?
Thanks in advance

rajesh
Guest
rajesh

i have uploaded image to data base and retrieved image from data base.
Suppose i retrieved object name Customer having following attributes id(long),name(String) , Image(byte array). I have set it in model attribute and got object in View but now how to display this Image in HTML.

Please help..

Biswajit
Guest
Biswajit

Hello mkyong,
I am getting this error for second part of code.
If u can please assist me,
“java.io.FileNotFoundException: C:\test.jpg (Access is denied)”
even if file is present or file is not present.
thanks in advance :)

Arun
Guest
Arun

Hi mykong !!
very useful example..i m using the same codings with oracle 10 i data base..IDE-net beans, server-appace…but while i run the program..its throwing some errors ..its,

Nov 27, 2011 2:10:40 PM org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 1461, SQLState: 72000
Nov 27, 2011 2:10:40 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ORA-01461: can bind a LONG value only for insert into a LONG column

so dould u help me out from this problem..thanks in advance…

prakash
Guest
prakash

I am also getting the same issue ?

ORA-01461: can bind a LONG value only for insert into a LONG column.
As we are inserting binary into long, how to fix this.

indonesian_programmer
Guest
indonesian_programmer

as for the mapping, could you give us the annotation way on this ?? :)

and do i have to use those number 2 ?? Maven dependency ?? I don’t use Maven in my project :)

thanks

juragan_top
Guest
juragan_top

fantastic example.. very simple and 100000% work !!

Anu
Guest
Anu

Hello,

Do u have an example where i can store and retrieve image from jsf page through database.

Thanks.

gerves
Guest
gerves

sir I want to upload image to database from any folder not just from c: using hibernate please help

Arun.R.U
Guest
Arun.R.U
Hello Mkyong, How are you ? Really useful program, once again i came here for your help, hey do you know how to save file to database from “web application” ? I tried a lot, but its only works if file size is <=2kb. Please, if you know then tell me how to do it.. when retrieving its fine, no problem with retrieving. But when i am going to save then its getting problem.. Its really helpful if its with struts2.. thanks a lot for your useful programs(I did blob and clob programs with standalone applcations).. i always came here… Read more »