Tenho duas entidades, PrecoContrato e TipoServico. Preciso fazer um relacionamento OneToOne com elas.
Seguem as entidades:
@Entity
@Table(name = "PRECO_CONTRATO")
public class PrecoContrato implements java.io.Serializable {
private PrecoContratoId id;
private BigDecimal vlUnidadeServico;
private TipoServico tipoServico;
public PrecoContrato() {
}
public PrecoContrato(PrecoContratoId id, BigDecimal vlUnidadeServico, TipoServico tipoServico) {
this.id = id;
this.vlUnidadeServico = vlUnidadeServico;
this.setTipoServico(tipoServico);
}
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "sqAquisicao", column = @Column(name = "SQ_AQUISICAO", nullable = false, precision = 10, scale = 0)),
@AttributeOverride(name = "cdTipoServico", column = @Column(name = "CD_TIPO_SERVICO", nullable = false, precision = 3, scale = 0)) })
@NotNull
public PrecoContratoId getId() {
return this.id;
}
public void setId(PrecoContratoId id) {
this.id = id;
}
@Column(name = "VL_UNIDADE_SERVICO", nullable = false, precision = 8)
@NotNull
public BigDecimal getVlUnidadeServico() {
return this.vlUnidadeServico;
}
public void setVlUnidadeServico(BigDecimal vlUnidadeServico) {
this.vlUnidadeServico = vlUnidadeServico;
}
@Entity
@Table(name = "TIPO_SERVICO")
public class TipoServico implements java.io.Serializable {
private short cdTipoServico;
private String tpPeriodicidade;
private String dsTipoServico;
private PrecoContrato precoContrato;
public TipoServico() {
}
public TipoServico(short cdTipoServico, String tpPeriodicidade,
String dsTipoServico, PrecoContrato precoContrato) {
this.cdTipoServico = cdTipoServico;
this.tpPeriodicidade = tpPeriodicidade;
this.dsTipoServico = dsTipoServico;
this.setPrecoContrato(precoContrato);
}
@Id
@Column(name = "CD_TIPO_SERVICO", unique = true, nullable = false, precision = 3, scale = 0)
public short getCdTipoServico() {
return this.cdTipoServico;
}
public void setCdTipoServico(short cdTipoServico) {
this.cdTipoServico = cdTipoServico;
}
@Column(name = "TP_PERIODICIDADE", nullable = false, length = 1)
@NotNull
@Length(max = 1)
public String getTpPeriodicidade() {
return this.tpPeriodicidade;
}
public void setTpPeriodicidade(String tpPeriodicidade) {
this.tpPeriodicidade = tpPeriodicidade;
}
@Column(name = "DS_TIPO_SERVICO", nullable = false, length = 50)
@NotNull
@Length(max = 50)
public String getDsTipoServico() {
return this.dsTipoServico;
}
public void setDsTipoServico(String dsTipoServico) {
this.dsTipoServico = dsTipoServico;
}
}
Como tá ali em cima, eu tenho uma EmbeddedId Class na entidade PrecoContrato, pois na tabela possuo duas pFK, sqAquisicao e CdTipoServico (essa vem da tabela TipoServico).
Aqui vai a IdClass:
@Embeddable
public class PrecoContratoId implements java.io.Serializable {
private long sqAquisicao;
private short cdTipoServico;
public PrecoContratoId() {
}
public PrecoContratoId(long sqAquisicao, short cdTipoServico) {
this.sqAquisicao = sqAquisicao;
this.cdTipoServico = cdTipoServico;
}
@Column(name = "SQ_AQUISICAO", nullable = false, precision = 10, scale = 0)
public long getSqAquisicao() {
return this.sqAquisicao;
}
public void setSqAquisicao(long sqAquisicao) {
this.sqAquisicao = sqAquisicao;
}
@Column(name = "CD_TIPO_SERVICO", nullable = false, precision = 3, scale = 0)
public short getCdTipoServico() {
return this.cdTipoServico;
}
public void setCdTipoServico(short cdTipoServico) {
this.cdTipoServico = cdTipoServico;
}
public boolean equals(Object other) {
if ((this == other))
return true;
if ((other == null))
return false;
if (!(other instanceof PrecoContratoId))
return false;
PrecoContratoId castOther = (PrecoContratoId) other;
return (this.getSqAquisicao() == castOther.getSqAquisicao())
&& (this.getCdTipoServico() == castOther.getCdTipoServico());
}
}
Preciso criar um relacionamento OneToOne com essas duas entidades. Já tentei usar mappedBy, targetEntity. Não vai nada.
Andei pesquisando e a forma que julguei mais correta de fazer o relacionamento foi a seguinte:
Na Entidade PrecoContrato:@OneToOne(fetch=FetchType.LAZY, mappedBy="precoContrato", cascade=CascadeType.ALL)
public TipoServico getTipoServico() {
return tipoServico;
}
public void setTipoServico(TipoServico tipoServico) {
this.tipoServico = tipoServico;
}
@OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(name = "CD_TIPO_SERVICO", referencedColumnName = "CD_TIPO_SERVICO", unique=true, nullable=false)
public PrecoContrato getPrecoContrato() {
return precoContrato;
}
public void setPrecoContrato(PrecoContrato precoContrato) {
this.precoContrato = precoContrato;
}
Mas sempre, na maioria das vezes, pego esse erro: "org.hibernate.MappingException: broken column mapping for: pmnTipoServico.id of: org.domain.bl.entity.PmnPrecoContrato"
Alguém pode me ajudar?
Grato!