Dúvida em Mapeamento

Olá povo, estou muitíssimo injuriado com uma pequena briga com um relacionamento JPA.
Vou explicar primeiro a necessidade depois expor os meus códigos, onde gostaria de ajuda:

Tenho 3 entidades: DOADOR, RECEPTOR e ATENDIMENTO.

é um software para um hemocentro, sendo assim, para que haja um ATENDIMENTO, ou seja o que equivale a uma doação, preciso de um ou mais doadores e um ou mais receptores.

Pois bem, o atendimento, tinha criado assim:

[code]@Entity
@Table(name = “atendimento”)
public class Atendimento implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ATENDIMENTO_ID")
private Long id;

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "receptor_atendimento_doador", joinColumns = { @JoinColumn(name = "ATENDIMENTO_ID") }, inverseJoinColumns = { @JoinColumn(name = "DOADOR_ID") })
private List<Doador> doadores = new ArrayList<Doador>();

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "receptor_atendimento_doador", joinColumns = { @JoinColumn(name = "ATENDIMENTO_ID") }, inverseJoinColumns = { @JoinColumn(name = "RECEPTOR_ID") })
private List<Receptor> receptores = new ArrayList<Receptor>();L, fetch = FetchType.LAZY)
@JoinTable(name = "receptor_atendimento_doador", joinColumns = { @JoinColumn(name = "ATENDIMENTO_ID") }, inverseJoinColumns = { @JoinColumn(name = "RECEPTOR_ID") })
private List<Receptor> receptores = new ArrayList<Receptor>();

[/code]

O doador assim:

@Entity
@Table(name = "doador")
public class Doador implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "DOADOR_ID")
	private Long id;

	@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinTable(name = "receptor_atendimento_doador",
	joinColumns = { @JoinColumn(name = "DOADOR_ID") },
	inverseJoinColumns = { @JoinColumn(name = "ATENDIMENTO_ID") })
	private List<Atendimento> atendimentos;

E o receptor assim:

@Entity
@Table(name = "receptor")
public class Receptor implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "RECEPTOR_ID")
	private Long id;

	@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinTable(name = "receptor_atendimento_doador", joinColumns = { @JoinColumn(name = "RECEPTOR_ID") }, inverseJoinColumns = { @JoinColumn(name = "ATENDIMENTO_ID") })
	private List<Atendimento> atendimentos;

Omiti os outros valores, exibindo apenas os relacionamentos aqui.
Mas o problema é que não são criadas chaves estrangeiras, ou mesmo é persistido o atendimento…
Porquê? Me digam o que estou errando, como devo consertar? Alguém que já passou o mesmo problema pode dar uma luz?

Faltou explicar como você está tentando persistir isso aí, e dizer exatamente o que ocorre.

Simplesmente dizer que não funciona não ajuda em muita coisa :slight_smile:

Olá, Rodrigo, tudo bem?

Para persistir, de um modo simples:
Para os atendimentos, uso isso aí…

public void salvar(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			List<Doador> doadores = new ArrayList<Doador>();
			for (DoadoresWrapper doadoresWrapper : listaDoadores) {
				if (doadoresWrapper.isSelecionado()) {
					doadores.add(doadoresWrapper.getDoador());
				}
				List<Receptor> receptores = new ArrayList<Receptor>();
				for (ReceptoresWrapper receptoresWrapper : listaReceptores) {
					if (receptoresWrapper.isSelecionado()) {
						receptores.add(receptoresWrapper.getReceptor());
					}
					atendimentoEdicao.setReceptores(receptores);
					atendimentoEdicao.setDoadores(doadores);
				}
				new AtendimentoService().salvar(this.atendimentoEdicao);
			}
			FacesMessage msg = new FacesMessage("Atendimento Cadastrado com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
			inicializar();
		} catch (RegraNegocioException e) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage("Erro inesperado ao cadastrar atendimento! " + e.getMessage());
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}
	}

Para os doadores, e do mesmo modo os reecptores isso:

public void salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new UsuarioService().salvar(this.usuarioEdicao);
			this.usuarioEdicao = new Usuario();
			FacesMessage msg = new FacesMessage("Usuario salvo com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
		} catch (RegraNegocioException e) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage("Erro inesperado ao salvar usuario!" + e);
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}
	}

Este é o erro:

Este é o banco gerado pelo Hibernate:


Bom, pra mim parece que a geração do ID para o seu Receptor não está funcionando

Não só dele, creio que o relacionamento pode estar errado, já tentei de duas formas, relacionando uma tabela para cada 2 entidades, mas na hora de listar muitos dado ficavam duplicados, então, um colega disse que poderia ser resolvido de modo que usasse uma única tabela para armazenar os id’s das 3 entidades, então esse foi um teste que não estou tendo sucesso…
Mas, do doador também acontece às vezes o mesmo problema.
O que sugere ser feito neste caso?

Meu objetivo é tornar possível listar algos dados relacionados aos atendimentos ( data do atendimento, num de ordem ), receptor (nome do hospital, nome do receptor, num doacao e tipo sanguineo ) e doador ( os numeros das bolsas de sangue de cada doador que participou do atendimento ), em SQL, se usasse 4 tabelas, sendo uma para doador_atendimento e outra receptor_atendimento ficaria assim:

[code]SELECT
atendimento.ID_ATENDIMENTO,
receptor.ID_RECEPTOR,
doador.ID_DOADOR,

atendimento.DATA_COLETA,
atendimento.NUM_ORDEM,


receptor.NOME_RECEPTOR,
receptor.NOME_HOSPITAL,
receptor.NUM_DOACAO as NUM_DOACAO_RECEPTOR,
receptor.TIPO_HEMO,
receptor.TIPO_SANGUINEO,
receptor.RH,
receptor.VOLUME,

doador.NUM_DOACAO as NUM_DOACAO_DOADOR
	
FROM agets.atendimento atendimento

LEFT OUTER JOIN
agets.receptor receptor on receptor.ID_RECEPTOR = atendimento.ID_ATENDIMENTO
RIGHT OUTER JOIN
agets.doador doador on doador.ID_DOADOR = atendimento.ID_ATENDIMENT[/code]

o problema é que em HQL ou criteria não consegui fazê-lo de um modo que não trouxesse dados repetidos… então estaria tentando ver se há algum erro no relacionamento.

Mas porque o ID não é setado? Levando em consideração que está marcado como
@Id e
@GeneratedValue(strategy = GenerationType.IDENTITY)

Então, Rodrigo, o que você recomenda para resolver esse problema?
Estou no caminho certo?