Spring+Hibernate 사용하여 CLOB,BLOB처리 방법

1,867 views
Skip to first unread message

Goodguy

unread,
Nov 6, 2011, 11:36:47 PM11/6/11
to Korea Spring User Group
안녕하세요.
매번 눈팅만 하다가 이렇게 글 올립니다.

현재 Spring(v3.0.4),Hibernate(v3.6)를 주로 이용하여 시스템을 개발하고 있습니다.
올해 처음으로 Java를 사용하는 데다가 Spring을 기반으로 개발하다 보니
정말 어려웠습니다.
왠만 한거 구글링하고 토비 Spring 책을 보고 개발을 했는데요.
잘 안되는 부분이 있어 이렇게 글 올립니다.

위 제목으로 하시겠지만 Hibernate 사용하여 오라클에 CLOB,BLOB 타입으로
데이터를 관리해야 할 부분이 있는데요. 잘 안되네요.
여러 전문가 분들의 조언이 필요합니다.
기본적인 CRUD 함수들은 org.springframework.orm.hibernate3.HibernateTemplate 의 함
수들 사용했습니다.

Goodguy

unread,
Nov 6, 2011, 11:45:10 PM11/6/11
to Korea Spring User Group
추가로 오라클 DB의 테이블 속성 타입이 BLOB,CLOB입니다.
이 타입으로 된 테이블에 데이터를 hibernate를 이용하여 삽입,삭제,갱신과 같은 기능을 처리해야 합니다.

BLOB,CLOB로 하지 말고 다른 방법을 찾아볼려고 했으나
지금은 이렇게 처리 할 수 밖에 없을 것 같습니다.

전문가 분들의 해결 방법이나 아니면 새로운 다른 방법도 좋습니다.

Sungchul Park

unread,
Nov 7, 2011, 12:46:53 AM11/7/11
to ks...@googlegroups.com, Goodguy
특별히 어떤 문제가 있는 건가요? 아니면 BLOB이나 CLOB을 다루는 방법을 모
르시는 건가요?

JPA나 하이버네이트로 BLOB이나 CLOB을 다루는 방법은 인터넷에 많이 나와있
으니 보시면 쉽게 하실 수 있을 거구요.

http://stevedaskam.wordpress.com/2011/03/28/using-jpa-to-insert-and-retrieve-blobs-and-clobs/

다만 오라클 JDBC 드라이버가 종종 이상하게 작동하는 일이 있어 그에 따라
우회할 필요가 있습니다. 최신 버전이나 이전 버전의 드라이버로 바꾼다거나
CLOB이 아닌 일반 VARCHAR2 컬럼으로 다룬다거나...

만약 무슨 문제가 있는 거라면 어떤 문제인지 알려주세요.

배치 업데이트 문제라거나 CLOB에 NULL이 안 들어가는 문제라거나 여러가지
문제가 생기긴 합니다.

Goodguy

unread,
Nov 7, 2011, 3:43:09 AM11/7/11
to Korea Spring User Group
답변 주셔서 정말 감사합니다.
다루는 방법을 몰라서 글을 올렸습니다.
제가 인터넷에서 검색한 방법은 hibernate.createBlob(byte[]) 메서드를 이용할려고 했는데요.
제가 사용하는 hibernate 버전에서는 사용할 수가 없네요. 이클립스에서 hibernate 플러그인 툴로 테이블과 자바 객체

매핑하는 클래스를 자동 생성하는데요. 이 방법을 사용하니 테이블의 blob,clob로 되어 있는 속성이 자바 객체에서도
blob, clob 타입으로 생성되네요. 이렇게 해서 실행을 시키니 아래 URL에 나오는 에러가 나는데요.
Hibernate 버전 문제 인 것 같기도 합니다만 제가 잘 모르겠네요. 제가 hibernate 3.6.0을 사용하거든요.

https://hibernate.onjira.com/browse/HHH-5659?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel

그리고 알려주신 방법은 제가 아직 찾지 못했습니다. 한 번해 봐야 할 것 같은데요.
알려주신 url로 들어가 보니 clob은 string으로 type mapping한 것 같고
blob는 object로 type mapping 한 것 같네요. 그리고 @Lob anotation을 사용했네요. 그런데
BlobDao라는 클래스는 어떻게 구현되어 있는지 알 수가 없네요. 제가 잘 몰라서 그러니 좀 더 알려주세요.
그리고 Blob에는 이미지를 저장할려고 하고요. Clob는 엑셀파일을 저장할려고 하는데요.
엑셀 파일을 저장하고 검색했을때 결과가 리턴되는 데는 문제가 없나요? 엑셀파일을 clob에 저장하는게 맞나요?

On 11월7일, 오후2시46분, Sungchul Park <gyu...@gmail.com> wrote:
> 특별히 어떤 문제가 있는 건가요? 아니면 BLOB이나 CLOB을 다루는 방법을 모
> 르시는 건가요?
>
> JPA나 하이버네이트로 BLOB이나 CLOB을 다루는 방법은 인터넷에 많이 나와있
> 으니 보시면 쉽게 하실 수 있을 거구요.
>

> http://stevedaskam.wordpress.com/2011/03/28/using-jpa-to-insert-and-r...


>
> 다만 오라클 JDBC 드라이버가 종종 이상하게 작동하는 일이 있어 그에 따라
> 우회할 필요가 있습니다. 최신 버전이나 이전 버전의 드라이버로 바꾼다거나
> CLOB이 아닌 일반 VARCHAR2 컬럼으로 다룬다거나...
>
> 만약 무슨 문제가 있는 거라면 어떤 문제인지 알려주세요.
>
> 배치 업데이트 문제라거나 CLOB에 NULL이 안 들어가는 문제라거나 여러가지
> 문제가 생기긴 합니다.
>
>
>
> > 추가로 오라클 DB의 테이블 속성 타입이 BLOB,CLOB입니다.
> > 이 타입으로 된 테이블에 데이터를 hibernate를 이용하여 삽입,삭제,갱신과 같은 기능을 처리해야 합니다.
>
> > BLOB,CLOB로 하지 말고 다른 방법을 찾아볼려고 했으나
> > 지금은 이렇게 처리 할 수 밖에 없을 것 같습니다.
>
> > 전문가 분들의 해결 방법이나 아니면 새로운 다른 방법도 좋습니다.
>
> > On 11월7일, 오후1시36분, Goodguy<outofwo...@naver.com> wrote:
> >> 안녕하세요.
> >> 매번 눈팅만 하다가 이렇게 글 올립니다.
>
> >> 현재 Spring(v3.0.4),Hibernate(v3.6)를 주로 이용하여 시스템을 개발하고 있습니다.
> >> 올해 처음으로 Java를 사용하는 데다가 Spring을 기반으로 개발하다 보니
> >> 정말 어려웠습니다.
> >> 왠만 한거 구글링하고 토비 Spring 책을 보고 개발을 했는데요.
> >> 잘 안되는 부분이 있어 이렇게 글 올립니다.
>
> >> 위 제목으로 하시겠지만 Hibernate 사용하여 오라클에 CLOB,BLOB 타입으로
> >> 데이터를 관리해야 할 부분이 있는데요. 잘 안되네요.
> >> 여러 전문가 분들의 조언이 필요합니다.
> >> 기본적인 CRUD 함수들은 org.springframework.orm.hibernate3.HibernateTemplate 의 함

> >> 수들 사용했습니다.- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -

Hoyeol

unread,
Nov 7, 2011, 4:08:34 AM11/7/11
to Korea Spring User Group
JPA를 사용해서 파일 저장시에는
@Lobbyte[] content; 형식으로 사용하시면 됩니다.
Lob Annotation javadoc : http://download.oracle.com/javaee/5/api/javax/persistence/Lob.htmlThe
Lob type is inferred from the type of the persistent field or
property, and except for string and character-based types defaults to
Blob.
Excel 파일도 blob 저장이 맞을것같네요
그리고 위의 Using JPA to Insert and Retrieve BLOBs and CLOBs 해당 글의 BlobDao는
EntityManager를 사용하는 형태로 되어있을것같네요.

On 11월7일, 오후5시43분, Goodguy <outofwo...@naver.com> wrote:
> 답변 주셔서 정말 감사합니다.
> 다루는 방법을 몰라서 글을 올렸습니다.
> 제가 인터넷에서 검색한 방법은 hibernate.createBlob(byte[]) 메서드를 이용할려고 했는데요.
> 제가 사용하는 hibernate 버전에서는 사용할 수가 없네요. 이클립스에서 hibernate 플러그인 툴로 테이블과 자바 객체
> 를
> 매핑하는 클래스를 자동 생성하는데요. 이 방법을 사용하니 테이블의 blob,clob로 되어 있는 속성이 자바 객체에서도
> blob, clob 타입으로 생성되네요. 이렇게 해서 실행을 시키니 아래 URL에 나오는 에러가 나는데요.
> Hibernate 버전 문제 인 것 같기도 합니다만 제가 잘 모르겠네요. 제가 hibernate 3.6.0을 사용하거든요.
>
> https://hibernate.onjira.com/browse/HHH-5659?page=com.atlassian.jira....

Goodguy

unread,
Nov 7, 2011, 9:45:48 PM11/7/11
to Korea Spring User Group
알려주신 방법외에 아래 와 같은 방법으로 테스트를 했는데요.
소스 코드는 아래와 같습니다.

LobHelper lobHelper =
sessionFactory.getCurrentSession().getLobHelper();

File inputfile = new File("E:\\nhnsvc.jpg");
FileInputStream fInSteam = new FileInputStream(inputfile);
BufferedInputStream bInputStream = new
BufferedInputStream(fInSteam);
ByteArrayOutputStream bOutputStream = new
ByteArrayOutputStream();
int nextByte;

while (( nextByte = bInputStream.read() ) != - 1)
{
bOutputStream.write(nextByte);
}
// Bob the builder builds a blob.
Blob bReport =
lobHelper.createBlob(bOutputStream.toByteArray());
systemconfiguration.setReportform1(bReport);
super.getHibernateTemplate().save(systemconfiguration);

그런데 아래와 같은 에러 발생하는데요. 혹시 아시는 분 있으신가요?
제가 검색을 잘못해서 그런지 모르겠지만 구글링해도 검색이 안되네요. hibernate 버전은 v3.6.8, Spring 버전
은 v3.0.4 입니다.

org.springframework.orm.hibernate3.HibernateSystemException: Unable to
access blob stream; nested exception is
org.hibernate.HibernateException: Unable to access blob stream
at
org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:
679)
at
org.springframework.orm.hibernate3.SpringSessionSynchronization.translateException(SpringSessionSynchronization.java:
160)
at
org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:
148)
at org.springframework.transaction.support.TransactionSync

> > > - 원본 텍스트 보기 -- 원본 텍스트 숨기기 -

Goodguy

unread,
Nov 9, 2011, 2:24:00 AM11/9/11
to Korea Spring User Group
아래 방법으로 해결했습니다. 그런데 제가 hibernate 3.6.0을 사용했는데요.
여기에 버그가 있었습니다. 그래서 3.6.8로 변경하니 잘 되네요.^^

LobHelper lobHelper =
sessionFactory.getCurrentSession().getLobHelper();
Blob reportform1 = null;
Blob reportform2 = null;

if (isForm1 != null){
reportform1 = lobHelper.createBlob(isForm1 ,
isForm1.available());
systemconfiguration.setReportform1(reportform1);
}


if (isForm2 != null){
reportform2 = lobHelper.createBlob(isForm2 ,
isForm2.available());
systemconfiguration.setReportform2(reportform2);
}

super.getHibernateTemplate().save(systemconfiguration);

> org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAcce-ssException(SessionFactoryUtils.java:
> 679)
> at
> org.springframework.orm.hibernate3.SpringSessionSynchronization.translateEx-ception(SpringSessionSynchronization.java:
> 160)
> at
> org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCommi-t(SpringSessionSynchronization.java:

Reply all
Reply to author
Forward
0 new messages