Problemas com Mapeamento (JPA + Hibernate + Postgre)

Oi gente! Blzinha??

Preciso de ajuda!! Parei numa situaçao que não consigo entender e muito menos resolver!

Tenho a seguinte situação:
Um professor possui um vinculo com a Instituição academica e, atraves deste vinculo, pode atuar em mais de um curso.

O mapeamento ficou ± assim (usando JPA + Hibernate + Postgre):

@Entity
public class Professor implements Serializable {
    @Id
    @GeneratedValue
    private int codigo;
    @Column(length = 11)
    private String matricula;
    @OneToOne(cascade = CascadeType.ALL)
    private VinculoDocenciaIES vinculoIES;
    //outros objetos
    //construtor e getsetters
}

@Entity
public class VinculoDocenciaIES implements Serializable {
    @Id
    @GeneratedValue
    private int codigo;
    @OneToMany(cascade = {CascadeType.ALL})
    private List<Curso> cursosVinculados;
    //outros objetos
    //construtor e getsetters
}

@Entity
public class Curso implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenciaCurso")
    private int codigo;
    @Column(length = 150)
    private String nome;
    //outros objetos
    //construtor e getsetters
}

O QUE ACONTECE:

  • O hibernate criou as tabelas [Professor], [VinculoDocenciaIES], [Curso], [Vinculo_Curso];
  • A tabela [Professor] tem o atributo Vinculo_codigo (FK para vinculo)
  • Na tabela [Vinculo_Curso]:
    1. Não existe PK (coisa do hibernate!!)
    2. Existem somente duas colunas: vinculo_codigo (FK) e curso_codigo (FK
    3. Percebi nas restrições da tabela que ele cria ainda um outra Coluna chamada Vinculo_Curso_Codigo_key,
      que ele não mostra no design (como se fosse de controle interno)

O ERRO:

  • Insiro um professor que, logicamente, tem um Vinculo e este pode ter um ou mais cursos.
  • Quando vou tentar inserir um outro professor que TAMBÉM é professor do mesmo curso que o primeiro cadastrado, dá erro de unicidade de chave primária,
    justamente na coluna Vinculo_Curso_Codigo_key (que nao tenho acesso).

O QUE TENTEI:

  • Já tentei mudar o tipo de relacionamento para ManyToMany (not resolved)
  • Mudar a forma de gerencimento, criando uma outra Tabela chamada CursosVinculados, onde Vinculo tem relação OneToOne com Esta nova tabela
    e ela tem uma lista de Cursos (not resolved too)

Não consigo achar solução.
Peço ajuda de quem estiver vendo algo que eu não estou…

Espero ter sido claro!!
Valeu!
Deus abençoe

@OneToMany(cascade = {CascadeType.ALL}) private List<Curso> cursosVinculados;

Esta anotação não deve ir diretamente na classe Professor? Aí não seria necessario mapear VinculoDocenciaIES, o próprio Hibernate trataria disto.
Corrijam-me se falei besteira, mas acredito que isto pode ser feito.

Poderia, se o relacionamento professor/curso fosse direto.
Mas no caso acima, o domínio é: professor > vinculo > cursos

Até porque na classe vinculo não tem somente esse dado curso… tem outros atributos tb que caracterizam a relação profe x ies

valeu

Muitos que iniciam com frameworks que mapeiam objetos tomam erro de mapeamento.
Uma das formas que encontrei para evitar estes erros foi utilizar a classe que le o mapeamento e gera o banco!

se estiver usando o arquivo hibernate.cfg.xml

cria o banco no postgres vazio
add as linhas que mapeam suas entidades dentro do hiberante.cfg.xml .

EX :

<?xml version="1.0" encoding="utf-8"?>
	<property name="connection.driver_class">
		org.postgresql.Driver
	</property>
	<property name="dialect">
		org.hibernate.dialect.PostgreSQLDialect
	</property>
	<property name="connection.url">jdbc:postgresql:nome_do_banco</property>
	<property name="connection.username">postgres</property>
	<property name="connection.password">post</property>
	<property name="connection.pool_size">10</property>
    
	<!--classe mapeada -->		
	<mapping class="nomeDaPackage.Professor" />

</session-factory>

por fim execute a classe $GeraBanco:

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class $GerarBanco {
public static void main(String[] args) {
AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.configure();
SchemaExport export = new SchemaExport(cfg);
try {
export.create(true, true);
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
System.out.println("$GerarBanco.class : Não foi possível gerar o banco!");

	}

}

}

OBS : Se o mapeamento estiver errado, a Exception será lançada … apartir dai vá acertando os erros que serão descritos no console.

Espero ter ajudado.

BoaSorte() && BonsEstudos()