powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate byte[]
3 сообщений из 3, страница 1 из 1
Hibernate byte[]
    #34785820
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Надо в базу вставить картинку. Картинку преобразовал в byte[], теперь массив хотел бы вставить в базу.
В букваре прочитал что надо реализовать UserType. В сети нашел пример, но во время работы он спотыкается. выдает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
	at org.hibernate.lob.BlobImpl.excep(BlobImpl.java: 104 )
	at org.hibernate.lob.BlobImpl.getBytes(BlobImpl.java: 50 )
	at org.hibernate.lob.SerializableBlob.getBytes(SerializableBlob.java: 35 )
	at com.mysql.jdbc.PreparedStatement.setBlob(PreparedStatement.java: 2271 )
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setBlob(NewProxyPreparedStatement.java: 495 )
	at article.utils.BinaryBlobType.nullSafeSet(BinaryBlobType.java: 38 )
	at org.hibernate.type.CustomType.nullSafeSet(CustomType.java: 146 )
	at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java: 1997 )
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java: 2243 )
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java: 2660 )
	at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java: 56 )
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java: 250 )
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java: 234 )
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java: 141 )
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java: 298 )
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java: 27 )
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java: 1000 )
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java: 338 )
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java: 106 )
	at article.relation.HiberArticleStart.add(HiberArticleStart.java: 51 )
	at article.relation.HiberArticleStart.main(HiberArticleStart.java: 102 )
HiberArticleStart.java - мой тестовый класс.
ошибка появляется на вызове commit() класса Transaction

вот сама реализация интерфейса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
 public   class  BinaryBlobType  implements  UserType {
	 public   int [] sqlTypes() {
		 return   new   int [] { Types.BLOB };
	}

	 public   Class  returnedClass() {
		 return   byte []. class ;
	}

	 public   boolean  equals(Object x, Object y) {
		 return  (x == y)
				|| (x !=  null  && y !=  null  && java.util.Arrays.equals(
						( byte []) x, ( byte []) y));
	}

	 public  Object nullSafeGet(ResultSet rs, String[] names, Object owner)
			 throws  HibernateException, SQLException {
		Blob blob = rs.getBlob(names[ 0 ]);
		 return  blob.getBytes( 1 , ( int ) blob.length());
	}

	 public   void  nullSafeSet(PreparedStatement st, Object value,  int  index)
			 throws  HibernateException, SQLException {
		st.setBlob(index, Hibernate.createBlob(( byte []) value));
	}

	 public  Object deepCopy(Object value) {
		 if  (value ==  null )
			 return   null ;

		 byte [] bytes = ( byte []) value;
		 byte [] result =  new   byte [bytes.length];
		System.arraycopy(bytes,  0 , result,  0 , bytes.length);

		 return  result;
	}

	 public   boolean  isMutable() {
		 return  true;
	}

	 public  Object assemble(Serializable serializable, Object obj)
			 throws  HibernateException {
		 return  serializable;
	}

	 public  Serializable disassemble(Object obj)  throws  HibernateException {
		 return  (Serializable) obj;
	}

	 public   int  hashCode(Object obj)  throws  HibernateException {
		 return  obj.hashCode();
	}

	 public  Object replace(Object obj, Object obj1, Object obj2)
			 throws  HibernateException {
		
		 return  obj;
	}

}

вот объявление
Код: plaintext
<property name="image" column="Image" type="article.utils.BinaryBlobType"/>

persistance класс стандартный

типа
private byte[] image;

public byte[] getImage(){}
public void setImage(byte[] im){}


Я не могу понять что тут делать. Hibernate только начал изучать.

спасибо
...
Рейтинг: 0 / 0
Hibernate byte[]
    #34785867
smbdy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужно реализовывать свой UserType. Вам не приходила в голову мысль, что вы не первый и не последний кому нужно вставить картинку в базу ?
в персист. классе нужно сделать поле типа java.sql.Blob
...
Рейтинг: 0 / 0
Hibernate byte[]
    #34786277
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smbdyНе нужно реализовывать свой UserType. Вам не приходила в голову мысль, что вы не первый и не последний кому нужно вставить картинку в базу ?
в персист. классе нужно сделать поле типа java.sql.Blob

не могу с вами не согласится. вариант практически идеальный и работает хорошо.
На мой взгляд это решение портит концептуальную чистоту идеи.
Дело в следующем. Возьмем самый простую сущность - паспорт. Представим ее как бин-компонент. В качестве фотографии логически использовать поле типа Image (или BuferedImage). Теперь если мы хотим сохранять объект этого класса в базе мы используем Hibernate. Так вот задача Hibernate и заключается в том чтобы ничего не меняя в нашем PassBean сохранить его объект в базе. В этом как раз и заключается философия (на мой взгляд) hibernate.

По большому счету я бы и byte[] не стал бы в компонент засовывать для этой цели. Раз уж философия bean и hibernate претендуют на ясное разделение уровней приложения, то хотелось бы это использовать по максимуму.
Мне кажется разработчики hibernate для этого как раз и сделали интерфейсы типа UserType.

В общем ничего против коллеги - smbdy не имею, но мужики помогите плз. в любом случае понять почему же вываливается эта ошибка? хотя бы на будущее.
спасибо.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate byte[]
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]