Problema com Relacionamento JPA (tenta criar constraint FK indevidamente )

3 respostas
sudeval

Estou com o seguinte problema,

tem um relacionamento entre Modalidade e SubModalidade , algo como 1 Modalidade tem N Submodalidades:

@Entity
@Table(name="SUBMODALID")
public class SubModalidade implements Serializable{
/**
* Default Serial ID
*/
private static final long serialVersionUID = 1L;
	
@EmbeddedId
private SubModalidadePK subModalidadePK;

// demais propriedades da classe


// Relacionamento entre Modalidade
@ManyToOne	
    @JoinColumns({
        @JoinColumn(name="CDADMIN", referencedColumnName="CDADMIN", insertable=false, updatable=false ),
	@JoinColumn(name="CDMAPA", referencedColumnName="CDMAPA", insertable=false, updatable=false),
	@JoinColumn(name="CDREALIZAC", referencedColumnName="CDREALIZAC", insertable=false, updatable=false),
	@JoinColumn(name="CDMODALIDA", referencedColumnName="CDMODALIDA", insertable=false, updatable=false)
    })	
private Modalidade modalidade;
@Entity
public class Modalidade implements Serializable{
/**
* Default Serial ID
*/
private static final long serialVersionUID = 1L;
	
/**
* Classe responsável em fazer a chave Composta da Entidade Modalidade
*/
@EmbeddedId
private ModalidadePK modalidaPK;	

// demais propriedades

@OneToMany(mappedBy="modalidade")	
private List<SubModalidade> subModalidade;

aqui é o erro que me ocorre, quando o servidor é inicializado,

09:38:29,705 ERROR [SchemaUpdate] Unsuccessful: alter table SUBMODALID add constraint FKAA81B6483AE76290 foreign key (CDMAPA, CDADMIN, CDREALIZAC, CDMODALIDA) references Modalidade
09:38:29,720 ERROR [SchemaUpdate] DB2 SQL error: SQLCODE: -20255, SQLSTATE: 42915, SQLERRMC: FKAA81B648;DB2DBA.SUB;DB2DBA.MOD;DB2DBA.SUB;DB2DBA.SUBMODALID.FKAA81;3
09:38:29,720 INFO  [SchemaUpdate] schema update complete

O Banco é o DB2, essas tabelas ja existem no banco assim como o relacionamento entre elas, que está na seguinte ordem:

CDADMIN, CDMAPA, CDREALIZAC, CDMODALIDA

então eu acredito que seja, ele (JPA) tenta se relacionar em uma ordem diferente da existente (constraint) retorna o erro…
depois ele deve criar da forma que ele quer…
embora o relacionamento ocorra na aplicação corretamente quando eu faço o getModalidade da Classe SubModalidade (isso porque creio eu, apos o erro ele cria da forma que ele espera), mas eu queria saber como resolver tal erro, pra que não seja preciso o JPA criar uma outra constraint e sim usar a que ja existe no banco.

t+

3 Respostas

_fs

O schema do banco já existe, contudo o código para gerar o schema é rodado toda vez que a aplicação inicia? Por quê?

sudeval

então, na verdade uma vez ou outro ocorre de ser adicionado uma nova tabela…
(isso não quer dizer que esteja configurado para sempre gerar o schema a cada vez que a aplicação é iniciada), o fato é que se a aplicação estiver configurada para gerar o schema… essa mensagem ocorre, mas creio que deva ter uma forma em que seja dito a “ordem” das chaves da constraint do relacionamento.

sudeval

por incrivel que pareça resolvi com a ordem em que as propriedades se encontra no Bean de PK ( Embeddable ), no caso modalidade
alterei a ordem deles e dos get e set ( não sei se isso tem algo haver, mas ja que funcionou :smiley: )

vou postar aqui , pode ser que venha a ajudar alguém mais na frente…

@Embeddable
public class ModalidadePK implements Serializable {

@Column(name="CDADMIN", nullable=false)
private Integer codigoUnidadeAdministrativa;
	
@Column(name="CDMAPA", nullable=false)
private Integer codigoMapa;
	
@Column(name="CDREALIZAC", nullable=false)
private Integer codigoRealizacao;
	
@Column(name="CDMODALIDA", nullable=false)
private Integer codigoModalidade;

// constructor

// get e set
public Integer getCodigoUnidadeAdministrativa() {
    return codigoUnidadeAdministrativa;
}

public void setCodigoUnidadeAdministrativa(Integer codigoUnidadeAdministrativa) {
    this.codigoUnidadeAdministrativa = codigoUnidadeAdministrativa;
}

public Integer getCodigoMapa() {
    return codigoMapa;
}

public void setCodigoMapa(Integer codigoMapa) {
    this.codigoMapa = codigoMapa;
}

// demais get e set
Criado 7 de abril de 2008
Ultima resposta 8 de abr. de 2008
Respostas 3
Participantes 2