Problem in a OneToOne Relationship
lfelipeas Mar 11, 2011 2:41 PMI have an OneToOne relationship with two entities, one called PrecoContrato other called TipoServico. In these two entities I have the same object (that is a PK), that is cdTipoServico.
My problem is that I can't make it work. I get the error: org.hibernate.AnnotationException: Unknown mappedBy in: org.domain.bl.entity.PmnPrecoContrato.pmnTipoServico, referenced property unknown: org.domain.bl.entity.PmnTipoServico.pmnPrecoContrato.
Can somebody help me?
I'll post the entities here:
@Entity @Table(name = "PRECO_CONTRATO", schema = "BL_CORP_PRJ") 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; } @OneToOne(fetch = FetchType.LAZY, mappedBy="precoContrato") //@JoinColumn(name = "CD_TIPO_SERVICO", nullable = false, insertable = false, updatable = false) public TipoServico getTipoServico() { return tipoServico; } public void setTipoServico(TipoServico tipoServico) { this.tipoServico = tipoServico; } }
NOTE: When I used Seam's Generate Entities, the PmnPrecoContrato wasn't here. I added it.
@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()); } }
Here goes the TipoServico Entity
@Entity @Table(name = "TIPO_SERVICO", schema = "BL_CORP_PRJ") 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; } @OneToOne(fetch = FetchType.LAZY, mappedBy="tipoServico") //@JoinColumn(name = "CD_TIPO_SERVICO", nullable = false, insertable = false, updatable = false) public PrecoContrato getPrecoContrato() { return precoContrato; } public void setPrecoContrato(PrecoContrato precoContrato) { this.precoContrato = precoContrato; } }
NOTE: The same thing here. I added this PrecoContrato after I generated the entity.