Amigos, estou com um problema e preciso de ajuda.
Utilizo postgreSQL + java + hibernat + spring.
no meu banco eu tenho um campo do tipo TEXT, logo a minha entity foi gerada assim
@Column(name="ds_situacao_processamento_ws", length=2147483647)
private String dsSituacaoProcessamentoWs;
porem qdo eu coloco uma string grande nesse campo, ele simplemente não salva o conteudo desse campo
se eu colocar o
@Lob
ele fala que eu não posso salvar objetos grande quando estiver com o auto-commit habilitado, vou no meu applicationContext e coloco
<prop key="hibernate.connection.autocommit">false</prop>
porem continuo recebendo o erro:
Objetos Grandes não podem ser usados no modo de efetivação automática (auto-commit).
alguem pode me dar um help por favor??? preciso salvar um texto grande no banco… e se possivel continuar com o auto-comit(se bem que mesmo com ele false nao funcionou)
obrigado
Se vc estiver usando JPA.
Pode fazer assim:
[code] @Autowired
protected JpaTransactionManager txManager;
@Override
public void saveWithTransaction(T instance) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("complex");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try {
entityManager.persist(instance);
} catch (DaoException ex) {
log.error("save failed", ex);
txManager.rollback(status);
throw ex;
} finally {
try {
txManager.commit(status);
} catch (DaoException e) {
log.error("save failed", e);
e.printStackTrace();
txManager.rollback(status);
}
}
}[/code]
Uso este metodo para BLOB e LOB no postgreSQL.
Pois postgreSQL não aceita transaction anotada. Não me lembro o pq!!!
t+
Quebrado, o problema e que eu estou utilizando o hibernateTemplate do spring, e nao descobri como fazer uma transação ‘na mão’ voce sabe?
obrigado
Campo de texto muito grande você teria que mapear como Blob. Existe essa anotação para JPA/Hibernate.
entao ja tentei o @Lob mas mesmo assim nada
Como você mapeou?
Outra coisa, mapeia com lob, faz um drop da sua coluna e deixa a aplicação criar.
Então hoje esta assim:
@Column(name="ds_situacao_processamento_ws", length=2147483647)
private String dsSituacaoProcessamentoWs;
porem se eu colocar o @Lob, ele fala que nao pode salvar em auto-commit, eu vou no meu applicationContext e coloco o auto-commit para false, e ele continua falando a mesma coisa
fabioebner, tenta assim…
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Transaction tx = null;
try {
tx = session.beginTransaction();
// .. salva o o objeto
session.flush();
tx.commit();
} catch
try {
if (tx != null) tx.rollback();
} catch (HibernateException e1) {
// log etc ...
}
} finally {
try {
if (session != null) session.close();
} catch (HibernateException e) {
// log etc ...
}
}
}
}
Como seu campo é muito grande é melhor mapear como lob.
E o campo do banco coloca como OID.
Vamo ver se roda agora !!! :thumbup:
t+
obs: pode manter o autocommit como true
Quebrado, conforme descrevi acima
eu utilizo o hibernateTemplate do spring para gerenciar as transacoes e nao consigo(pelo menos ate hoje nao descobri) abrir uma transacao assim nao mao