在我的模型中,我使用以下内容:
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "CONTENUTO_BLOB", nullable = true)
public Blob getContenutoBlob()
{
return contenutoBlob;
}
注释@Lob
表明它是一个 Lob 列;@Basic(fetch=FetchType.LAZY)
指示加载实体而不将 Lob 加载到内存中;只有当你真正需要时,你才能进入 lob
更新
很长一段时间我不使用 XML 但如果我没记错你可以使用这样的东西:
<property name="contenutoBlob" type="org.hibernate.type.BinaryType" lazy="true">
</property>
更新 2
在任何情况下,我也从未使用hibernateTemplate
过 hibernateTemplate 您可以访问休眠会话 通常我会执行以下操作:
保存 Blob 方法
public void saveAllegato(InputStream fileIn, long lunghezza) throws DbException
{
//Dai test effettuati, quando siamo col portale attivo bisogna non chiudere
//mai lo stream
boolean closeStream = false;
try
{
//sf is the SessionFactory
Session sessione = sf.getCurrentSession();
Blob blob = null;
if (null != fileIn)
{
blob = Hibernate.getLobCreator(sessione).createBlob(fileIn, lunghezza);
}
AllegatoModel entity = new AllegatoModel();
//Set the other fields
if( blob != null )
{
entity.setContenutoBlob(blob);
}
// Save object
sessione.saveOrUpdate(entity);
}
catch (Exception e)
{
String message = "Errore nel salvataggio della entity " + entity + "; " + e.getMessage();
logger.error(message, e);
throw new PinfGpDbException(message);
}
finally
{
if (fileIn != null)
{
try
{
fileIn.close();
}
catch (Exception e)
{
//Stampo lo stacktrace solo quando il log ha livello di debug
if( logger.isDebugEnabled() )
{
logger.debug("Errore nella chiusura del file input stream ", e);
}
else if( logger.isWarnEnabled() )
{
logger.debug("Errore nella chiusura del file input stream; "+e.getMessage());
}
}
}
}
获取 BLOB 方法
public void writeAllegatoFile(Long id, OutputStream out) throws PinfGpDbException
{
StopWatch sw = new StopWatch("SCRITTURA FILE CON ID ["+id+"] SU OUTPUTSTREAM");
InputStream is = null;
try
{
sw.start("RECUPERO FILE DA DB");
DetachedCriteria criteria = DetachedCriteria.forClass(AllegatoModel.class);
criteria.add(Property.forName("id").eq(id));
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("contenutoBlob"), "contenutoBlob");
pl.add(Projections.property("id"), "id");
criteria.setProjection(pl);
criteria.setResultTransformer(Transformers.aliasToBean(AllegatoModelBlobDto.class));
Session sessione = sf.getCurrentSession();
List<AllegatoModelBlobDto> result = criteria.getExecutableCriteria(sessione).list();
sw.stop();
StopWatchUtils.printStopWatchInfo(sw, logger, false, "QUERY ESEGUITA CORRETTAMENTE. RECORD TROVATI "+result.size()+" RECUPERATO CORRETTAMENTE");
if (result.size() > 1)
{
throw new IllegalStateException("Impossibile proseguire trovati " + result.size() + "record per l'ID " + id);
}
AllegatoModelBlobDto theObj = result.get(0);
if (theObj != null)
{
Blob contenuto = theObj.getContenutoBlob();
if (contenuto != null)
{
sw.start("SCRITTURA FILE SU OUTPUT STREAM");
is = contenuto.getBinaryStream();
IOUtils.copy(is, out);
sw.stop();
StopWatchUtils.printStopWatchInfo(sw, logger, false, "SCRITTURA FILE TERMINATA CORRETTAMENTE");
}
}
}
catch (Exception e)
{
String message = "Errore nel recupero dell'allegato con ID " + id;
logger.error(message, e);
throw new PinfGpDbException(message, e);
}
finally
{
if(sw.isRunning())
{
sw.stop();
StopWatchUtils.printStopWatchInfo(sw, logger, true, "POSSIBILE ERRORE NELLA SCRITTURA DEL FILE");
}
if( is != null )
{
try
{
is.close();
}
catch (Exception e)
{
//Stampo lo stacktrace solo quando il log ha livello di debug
if( logger.isDebugEnabled() )
{
logger.debug("Errore nella chiusura del file input stream ", e);
}
else if( logger.isWarnEnabled() )
{
logger.debug("Errore nella chiusura del file input stream; "+e.getMessage());
}
}
}
if( out != null )
{
try
{
out.close();
}
catch (Exception e)
{
//Stampo lo stacktrace solo quando il log ha livello di debug
if( logger.isDebugEnabled() )
{
logger.debug("Errore nella chiusura dell'output stream ", e);
}
else if( logger.isWarnEnabled() )
{
logger.debug("Errore nella chiusura dell'output stream; "+e.getMessage());
}
}
}
}
}