Alterar @Table em uma Entity Manager

5 respostas
fabioebner

Pessoal alguem sabe se eh possivel eu alterar um @Table em uma entity em tempo de execucao? exemplo. eu tenho uma tela de cadastro de apresentante por exemplo, porem eu tenho cadastro de apresentante em 5 projetos diferente , entao eu queria fazer o seguinte, uma entity generica, que na hora q eu chamar essa tela de cadstro eu passo em qual catalog = “db”, schema = “schema” eu quero salvar… e possivel alterar esses valores via reflection ? antes de persistir o objeto??

valeu

5 Respostas

Lavieri

fabioebner:
Pessoal alguem sabe se eh possivel eu alterar um @Table em uma entity em tempo de execucao? exemplo. eu tenho uma tela de cadastro de apresentante por exemplo, porem eu tenho cadastro de apresentante em 5 projetos diferente , entao eu queria fazer o seguinte, uma entity generica, que na hora q eu chamar essa tela de cadstro eu passo em qual catalog = “db”, schema = “schema” eu quero salvar… e possivel alterar esses valores via reflection ? antes de persistir o objeto??

valeu

nossa! c acabou de me dar uma ideia =D … sempre quiz fazer isso… vou montar aqui, conseguindo posto aqui

abraços

Lavieri

consegui!

to usando o pacote Mirror, apenas pq ele ajuda a fazer reflexão, mas se quiser fazer com java puro! fique a vontade.... como VRaptor já vem com o pacote... =x

http://projetos.vidageek.net/mirror/annotations/

segue modo de trocar

Observação... Acesso é a minha classe que esta anotada com @Table

Table anotacao = Acesso.class.getAnnotation(Table.class);
		
		Object h = new Mirror().on(anotacao).get().field("h");
		LinkedHashMap memberValues = (LinkedHashMap)new Mirror().on(h).get().field("memberValues");
		memberValues.put("name", "blablabla");
		
		anotacao = Acesso.class.getAnnotation(Table.class);
		
		System.out.println(anotacao.name());
G

Você até pode alterar o valor do @Table, porém o JPA (e filhos) não fica lendo isso a toda hora que precisa usar. Isso fica dentro de um mapa de entidade <-> tabelas. por mais que você altere o valor do @Table ele sempre vai pegar o valor original de quando o entity-manager-factory foi inicializado.

Penso que o que você quer fazer é um pouco, desculpe a palavra, xunxo. Quem sabe você usa então herança entre essas classes, especializando conforme os tipos que você precisa.

Abraços

Lavieri

garcia-jj:
Você até pode alterar o valor do @Table, porém o JPA (e filhos) não fica lendo isso a toda hora que precisa usar. Isso fica dentro de um mapa de entidade <-> tabelas. por mais que você altere o valor do @Table ele sempre vai pegar o valor original de quando o entity-manager-factory foi inicializado.

Penso que o que você quer fazer é um pouco, desculpe a palavra, xunxo. Quem sabe você usa então herança entre essas classes, especializando conforme os tipos que você precisa.

Abraços

sim sim, tem que alterar antes da factory ser inicializada, isso é um fato

Lavieri

Simplificando o uso 10x =D

//eu sei que fica um pouco estranho, withValue() antes do theParameter .... mass... é a unica forma de não precisar escrever o nome das propriedades
AnnotationMirror.on(Acesso.class).set().onAnnotation(Table.class).withValue("TBLAcesso").theParameter().name();
AnnotationMirror.on(Acesso.class).set().onAnnotation(Table.class).withValue("dataBase1").theParameter().schema();
AnnotationMirror.on(Acesso.class).set().onAnnotation(Table.class).withValue("dbo").theParameter().catalog();


Table anotacao = Acesso.class.getAnnotation(Table.class);
System.out.println(anotacao.name());
System.out.println(anotacao.catalog());
System.out.println(anotacao.schema());

para usar essa abordagem faça download do .java anexado

Criado 20 de outubro de 2009
Ultima resposta 20 de out. de 2009
Respostas 5
Participantes 3