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?