Relacionamento OneToOne com compositeID

1 resposta
L

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;
	}
Na Entidade 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!

1 Resposta

L

Incrível como não consigo resposta nesse fórum.

Criado 15 de março de 2011
Ultima resposta 16 de mar. de 2011
Respostas 1
Participantes 1