/ / Erro no mapeamento de hibernação “Uma referência de chave estrangeira tem o número errado de coluna. deve ser 2 ”- java, spring, mapeamento de hibernação, spring-data-jpa, chave primária composta

Erro no mapeamento de hibernação “Uma referência de chave estrangeira tem o número errado de coluna. deve ser 2 ”- java, spring, mapeamento de hibernação, spring-data-jpa, composite-primary-key

TRANSFORMATION tabela tendo uma chave primária composta trans_id e version.
EXPRESSION tabela com referência de chave estrangeira de trans_id apenas, não tem um version coluna.

Através do JUnit quando tento salvar em TRANSFORMATION, Estou ficando abaixo do erro.

caused by: org.hibernate.AnnotationException: A Foreign key refering org.persistence.entity.Transformation from org.persistence.entity.Expression has the wrong number of column. should be 2
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:420) ~[hibernate-core-4.2.8.Final.jar:4.2.8.Final]
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:117) ~[hibernate-core-4.2.8.Final.jar:4.2.8.Final]
at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1560) ~[hibernate-core-4.2.8.Final.jar:4.2.8.Final]
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1481) ~[hibernate-core-4.2.8.Final.jar:4.2.8.Final]
...
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:250) ~[spring-test-4.0.2.RELEASE.jar:4.0.2.RELEASE]
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64) ~[spring-test-4.0.2.RELEASE.jar:4.0.2.RELEASE]
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91) ~[spring-test-4.0.2.RELEASE.jar:4.0.2.RELEASE]
... 25 more

@Entity(name="Transformation")
@Table(name="Transformation")
public class Transformation extends BaseEntity implements Serializable{


private static final long serialVersionUID = 1L;

@EmbeddedId
private TransformationPK id;
/*@OneToMany(mappedBy="transformation")
private Set<Expression> expressions;*/

@OneToMany
@JoinColumn(name="TRANS_ID", nullable = false)
@Fetch(FetchMode.SUBSELECT)
private Set<Expression> expressions;
}

@Embeddable
public class TransformationPK implements Serializable{

private static final long serialVersionUID = 1L;

@Column(name="TRANS_ID")
private String transId;

@Column(name="VERSION", precision = 2, scale = 1)
private Double transVersion;

public TransformationPK() {
}
}


@Entity(name="EXPRESSION")
@Table(name="EXPRESSION")
public class Expression extends BaseEntity implements Serializable{


private static final long serialVersionUID = 1L;

@Id
@Column(name = "Expression_ID")
@GeneratedValue(strategy=GenerationType.AUTO)
private String expressionId;

@Column(name="TRANS_ID")
private String transId;

/*@ManyToOne
@JoinColumns ({
@JoinColumn(name = "TRANS_ID", insertable = false, updatable = false),
@JoinColumn(name = "VERSION", insertable = false, updatable = false)
})
private Transformation transformation;*/

@ManyToOne
@JoinColumn(name = "TRANS_ID", nullable = false, insertable = false, updatable = false)
private Transformation transformation;
}

Alguém pode sugerir como resolver isso.

Respostas:

3 para resposta № 1

Como seu PK embutido tem duas colunas, aqui você deve ter duas colunas de junção também:

@ManyToOne
@JoinColumns({
@JoinColumn(name = "TRANS_ID", nullable = false, insertable = false, updatable = false),
@JoinColumn(name = "VERSION", ....
})
private Transformation transformation;

BTW, você tem associação de conversão bidirecional-Expression, você deve adicionar mappedBy em uma extremidade.