Erro na gravaçõ de dados no banco

2 respostas
C

Quem puder me ajudar, é o seguinte…

Tenho 02 classes, que seguem uma estratégia de herança… Usuário, que é a SUPERCLASSE, e Instituicao, que é a classe filha, conforme segue:

Usuario.java

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@SequenceGenerator(sequenceName="SEQUENCIA_USUARIO", name="sequencia")
public class Usuario implements Serializable {
	
	
	private static final long serialVersionUID = 5992649579251529723L;

	@Id
	@GeneratedValue(generator="sequencia", strategy=GenerationType.AUTO)
	protected Integer codigo;
	protected String nome;
	@NaturalId
	protected String email;
	protected String senha;
	protected boolean ativo;
	
	@ElementCollection(targetClass = String.class)
	@JoinTable(
			name="USUARIO_PERMISSAO",
			uniqueConstraints = {@UniqueConstraint(columnNames={"usuario", "permissao"})},
			joinColumns = @JoinColumn(name="usuario"))
	@Column(name = "permissao", length=50)
	private Set<String> permissao = new HashSet<String>();

// getters, setter, equals e hashcode....

E a classe Instituicao:

@Entity
public class Instituicao extends Usuario implements Serializable {
	
	
	private static final long serialVersionUID = 1060329190982590957L;
	
	private String abreviacao;
	private String tipo;
	private String logradouro;
	private String numero;
	private String complemento;
	private String bairro;
	private String cidade;
	private String Estado;
	private String cnpj;
	private String telefone;
	private String contato;
	private Date dataCadastro;
	private Date dataValidacao;
	private boolean validado;
	
	@ManyToOne
	@JoinColumn(insertable=true, updatable=true, name="codigo")
	private Usuario validador;

A idéia é o seguinte:
Ainda não refinei essa classe de usuario validador, mas em suma, para uma instituição ser um usuário ativo dentro do sistema, é necessario que antes, um usuario com poder de administrador valide a mesma.
Essa tag @JoinColumn não aceita que seja passada dessa forma, quando inicio o tomcat, na hora de configurar o Hibernate, ele aponta o seguinte erro:

Criação inicial do SessionFactory falhou: org.hibernate.MappingException: Repeated column in mapping for entity: webTest.entidades.instituicao.Instituicao column: codigo (should be mapped with insert="false" update="false")
Set 16, 2012 4:55:31 PM org.apache.catalina.core.StandardContext filterStart
Grave: Exception starting filter conexaoFilter
java.lang.ExceptionInInitializerError
	at webTest.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:21)
	at webTest.util.HibernateUtil.<clinit>(HibernateUtil.java:12)
	at webTest.util.filter.ConexaoHibernateFilter.init(ConexaoHibernateFilter.java:12)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4584)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5262)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5257)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: webTest.entidades.instituicao.Instituicao column: codigo (should be mapped with insert="false" update="false")
	at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676)
	at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698)
	at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:720)
	at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:474)
	at org.hibernate.mapping.JoinedSubclass.validate(JoinedSubclass.java:63)
	at org.hibernate.cfg.Configuration.validate(Configuration.java:1193)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1378)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	at webTest.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:18)
	... 14 more

Ou seja, o campo da chave estrangeira não pode ser inserido ou alterado, enfim.

Como posso construir este relacionamento, dado que uma instituição se cadastra normalmente, sendo inserido um objeto no banco representado a mesma, e depois o usuário administrador VALIDA esta instituição para ficar ativa.

Com o updatable e insertable como falso, o objeto USUARIO (que é o administrador) não é persistido, constando como null no banco.

Alguem consegue me ajudar?

2 Respostas

Gleidson_Henrique

Sou iniciante amigo, nao sei se entendi muito bem sua pergunta…

Mas, nao teria como setar esse campo como que permitindo valores nulos?

Se disse nada com nada, desculpe minha ignorância rsrs

Abraços

C

'magina, ignorancia nada… talvez tenha me expressado mal…

A classe instituição é herdada da classe usuario…

E a instituição tem uma “autoreferência”, para classe usuário…

Já tentei por o insertable e updatable como true, mas na hora de iniciar o tomcat, na configuração do hibernate da o erro que eu mencionei, que os parametros insertable e updatable DEVEM ser false.

A instituição se cadastra, e o usuario administrador depois valida…

Fazendo o debug, rodando a aplicação, o administrador fazendo a validação atualiza os outros campos, como data de validação, seta para true o validado, porém não salva no banco a referência para o usuario validador, quando o insertable e updatable está false, o que tecnicamente faz todo o sentido, mas para minha “logica” não está funcionando.

Gostaria de saber uma estratégia para que isso funcione. Como posso fazer para que isso funcione.

Criado 16 de setembro de 2012
Ultima resposta 17 de set. de 2012
Respostas 2
Participantes 2