Mapeamento duas UK na mesma tabela Hibernate [RESOLVIDO]

Implementei uma regra de negócios no banco de dados que ficou da seguinte forma

IDEMITENTE CPFCLI IDCLIENTE
1 0 1
1 1 2
2 0 3
2 1 4

Até ai tudo blz,
O problema agora esta em como mapear isto no hibernate???

vai lá um exemplo:


@Embeddable
public class ChequeId implements Serializable {

	private static final long	serialVersionUID	= 1284348059531750623L;

	@Basic(optional = false)
	@Column(name = "cheque", nullable = false)
	private Integer						cheque;

	@Basic(optional = false)
	@Column(name = "conta", nullable = false)
	private Integer						conta;

	public Integer getCheque() {
		return cheque;
	}

	public void setCheque(Integer cheque) {
		this.cheque = cheque;
	}

	public Integer getConta() {
		return conta;
	}

	public void setConta(Integer conta) {
		this.conta = conta;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + cheque;
		result = prime * result + conta;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final ChequeId other = (ChequeId) obj;
		if (cheque != other.cheque)
			return false;
		if (conta != other.conta)
			return false;
		return true;
	}

}


@Entity
@Table(name = "cheque")
public class Cheque implements Serializable {

	private static final long	serialVersionUID						= -7391845936828023963L;
	public static final char	SITUACAO_CHEQUE_BAIXADO			= 'B';
	public static final char	SITUACAO_CHEQUE_CANCELADO		= 'C';
	public static final char	SITUACAO_CHEQUE_NAO_EMITIDO	= 'N';

	@EmbeddedId
	private ChequeId					chequeId;

	@ManyToOne(fetch = FetchType.LAZY)
	@OnDelete(action=OnDeleteAction.CASCADE)
	@JoinColumn(name = "conta", referencedColumnName = "cod_conta", insertable = false, updatable = false)
	@ForeignKey(name = "fk_cheque_conta")
	private Conta							conta;

o DAO como fica

não sei se deu pra ajuda …mais da pra vc se virar um pouco…

abs


public class ChequeRN {

	private ChequeDAO	chequeDAO;

	public ChequeRN() {
		this.chequeDAO = DAOFactory.criarChequeDAO();
	}

	public void salvar(Cheque cheque) {
		this.chequeDAO.salvar(cheque);
	}

	public int salvarSequencia(Conta conta, Integer chequeInicial, Integer chequeFinal) {
		Cheque cheque = null;
		Cheque chequeVerifica = null;
		ChequeId chequeId = null;
		int contaTotal = 0;

		for (int i = chequeInicial; i <= chequeFinal; i++) {
			chequeId = new ChequeId();
			chequeId.setCheque(i);
			chequeId.setConta(conta.getConta().intValue());
			chequeVerifica = this.carregar(chequeId);

			if (chequeVerifica == null) {
				cheque = new Cheque();
				cheque.setChequeId(chequeId);
				cheque.setSituacao(Cheque.SITUACAO_CHEQUE_NAO_EMITIDO);
				cheque.setDataCadastro(new Date(System.currentTimeMillis()));
				this.salvar(cheque);
				contaTotal++;
			}
		}
		return contaTotal;
	}

Bom eu num sei se entendi bem mais este gera FK e não UK

mais eu vou testar!

nesse exemplo que te passei é uma chave UK composta de dois campos onde um deles de uma FK com outra tabela
por referência pois só vai entrar valor nesse campo se existir na tabela pai.

outro exemplo abaixo onde existe três campos como chave na classe PostoUsuarioId

e na classe abaixo como vai ficar chave composta UK e suas referência

espero ter ajudado…

@Embeddable
public class PostoUsuarioId implements Serializable {

	private static final long serialVersionUID = -4476596399409381166L;

	@Column(name = "CD_POSTO_ATENDIMENTO")
	private Long postoId;

	@Column(name = "CD_USUARIO")
	private Long usuarioId;

	@Column(name = "CD_PERFIL")
	private Long perfilId;

	public PostoUsuarioId() {
	}

	PostoUsuarioId(Long usuarioId, Long postoId, Long perfilId) {
		this.usuarioId = usuarioId;
		this.postoId = postoId;
		this.perfilId = perfilId;
	}

	public Long getPostoId() {
		return postoId;
	}
@Entity
@Table(name = "TB_PTA_POSTO_AGENDAMENTO")
public class PostoAgendamento implements EntityModel {

	@EmbeddedId
	private PostoAgendamentoId id;

	private Manutencao manutencao;

	@ManyToOne
	@JoinColumn(name = "CD_POSTO_ATENDIMENTO", insertable = false, updatable = false)
	private Posto posto;

	@ManyToOne
	@JoinColumn(name = "CD_AGENDAMENTO", insertable = false, updatable = false)
	private Agendamento agendamento;

	public PostoAgendamento() {
	}

	public PostoAgendamento(Posto posto, Agendamento agendamento, Long idUsuario) {
		this.posto = posto;
		this.agendamento = agendamento;
		id = new PostoAgendamentoId(posto.getId(), agendamento.getId());
		manutencao = new Manutencao(idUsuario);
	}

	public Serializable getId() {
		return id;
	}

	public Manutencao getManutencao() {
		return manutencao;
	}

	public Posto getPosto() {
		return posto;
	}

	public void setPosto(Posto posto) {
		this.posto = posto;
	}

não lê a classe PostoAgendamento e assim a de baixo assim fica mais facil
de entender…

abs


@Entity
@Table(name = "TB_PTA_PERFIL_POSTO_USUARIO")
public class PerfilPostoUsuario implements EntityModel {

	@EmbeddedId
	private PostoUsuarioId id;

	private Manutencao manutencao;

	@ManyToOne
	@JoinColumn(name = "CD_USUARIO", insertable = false, updatable = false)
	private Usuario usuario;

	@ManyToOne
	@JoinColumn(name = "CD_POSTO_ATENDIMENTO", insertable = false, updatable = false)
	private Posto posto;

	@ManyToOne
	@JoinColumn(name = "CD_PERFIL", insertable = false, updatable = false)
	private Perfil perfil;
	
	public PerfilPostoUsuario(Usuario usuario, Posto posto, Perfil perfil,Long idUsuario) {
		this.usuario = usuario;
		this.posto = posto;
		this.perfil = perfil;
		id = new PostoUsuarioId(usuario.getId(), posto.getId(), perfil.getId());
		manutencao = new Manutencao(idUsuario);
	}

	public PostoUsuarioId getId() {
		return id;
	}

	public Manutencao getManutencao() {
		return manutencao;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

um exemplo na pratica…

boa sorte

Otimos ambos exemplos,
Consegui adaptar pra utilizar no meu sistema aqui e cairam como uma luva…
e para um outro sistema que estou desenvolvendo para meu estágio acho que vou utilizar uma delas…

De quebra ainda consigui fazer de outra forma diferente que por sinal estou utilizando agora!

Adionando estas anotations

@Entity
@Table(name = "CLIENTE", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"CNPJ", "idEmitente"}),
    @UniqueConstraint(columnNames = {"CPF", "idEmitente"})})

Obrigado!

Opaa
ficou bacana este modeo,
vou utilizar no meu projeto tbm
^^