Olá.
Preciso que o hibernate ignore um atributo não @Transient ao persistir.
Pq não @Transient?
Pq numa situação preciso que este objeto passe pela rede, ou seja, ele será serializado e o processo de serialização também ignora @Transient.
Mas nesse caso quero o atributo vá junto.
Ou seja, se coloco @Transient ele não é persistido, o correto.
Mas ele não passa pela rede.
Se não coloco @Transient, ele será persistido, errado.
Por outro lado ele passará pela rede.
Uma solução seria criar uma classe, herdando a primeira, configurando essa classe para serializar o atributo marcado como @Transient.
Essa classe seria utilizada na serialização do objeto pela rede.
[code]class A implements Serializable {
@Transient
protected Object obj;
}
class B extends A {
private void writeObject(ObjectOutputStream os) {
try {
os.defaultWriteObject();
os.writeObject(obj);
} catch (Exception e) { e.printStackTrace(); }
}
private void readObject(ObjectInputStream is) {
try {
is.defaultReadObject();
this.obj = is.readObject();
} catch (Exception e) { e.printStackTrace(); }
}
}[/code]
Outra solução, seria setar o atributo para null, antes da chamada do hibernate.
Obrigado pelas dicas heatcold. Me deu algumas ideias.
A primeira opção é complicado. Muitas classes.
Apenas se usasse uma manipulação de bytecode para gerar essas classes em runtime. Mas isto tb teria problemas, pois o outro lado, a outra JVM não teria essas novas classes geradas em runtime.
A segunda opção não é viável pois não existe coluna para este atributo na tabela, não é questão de ser ou não persistido, mas sim não há onde persistir. Dai o hibernate estoura pois a coluna não existe.
Uma outra forma de fazer o que você quer seria escrever manualmente o insert.
ja tentou colocar os atributos insertable=false, updatable=false
na anotação @JoinColumn
?
Bem, pensei que a semântica fosse diferente, do modificador transient, do java, para indicar que o atributo não vai ser serializável, e o @Transient do JPA que é para informar que o atributo não vai ser persistente, estou errado? Tem certeza @Transient do JPA também funcionapara indicar que o atributo não irá ser serializável? … De todo modo, eu uso o @Transient no método get do objeto, e nunca tive problemas com a serialização.