[Resolvido] Inner Join com hibernate

3 respostas
alberson

Olá!

Tenho 2 tabelas mensagem e mensagem_trl, que se ligam pelo campo mensagem_id.
Estou tentando criar uma entidade de mensagem que já me traga uma mensagem_trl, mas não está saindo como planejei.

tabela mensagem:
mensagem_id varchar(32)
mensagem varchar(500)

tabela mensagem_trl
mensagem_trl_id varchar(32)
mensagem_id varchar(32)
traduzido char(1)
mensagem varchar(500)

Java:

@Entity
@Component
@Table(schema = "public", name = "mensagem")
public class Mensagem implements Serializable {
	@Id
	@Column(name = "mensagem_id")
	private String mensagemId;
	private String mensagem;

	private MensagemTrl traducao;

	@OneToOne
	@JoinColumn(name = "mensagem_id")
	public MensagemTrl getTraducao () {
	return this.traducao;
	}
//getters e setters
}

@Entity
@Component
@Table(schema = "public", name = "mensagem_trl")
public class MensagemTrl implements Serializable {
	@Column(name = "mensage_trl_id")
	private String mensagemTrlId
	@JoinColumn(name = "mensagem_id")
	private String mensagemId;
	private char traduzido;
	private String mensagem;
//getters e setters
}

E estou usando o VRaptor pra dar saida aos dados.

Meu jsp está assim:

<c:forEach items="${messageList }" var="msg">
	<tr>
		<td>${msg.mensagemId }</td>
		<td>${msg.mensagem }</td>
		<td>${msg.traducao.mensagemTrlId }</td>
		<td>${msg.traducao.mensagem }</td>
	</tr>
</c:forEach>

Mas os itens traducao.mensagemTrlId e msg.traducao.mensagem estão vindo vazios.
Debugando o projeto, o atributo traducao está vindo vazio (null).
Na saída do Hibernate no console, ele está tentado fazer:

left outer join
       public.mensagem_trl mensagemtrl2_ 
           on this_.mensagem_id=mensagemtrl2_.mensagem_trl_id

Alguma luz?

3 Respostas

drsmachado

Você está fazendo a pesquisa através de get/load ou de uma HQL ou Criteria?

Hebert_Coelho

drsmachado:
Você está fazendo a pesquisa através de get/load ou de uma HQL ou Criteria?
Além disso aqui, você tem certeza que existem dados no db?

Pois eu reparei que você não tem cascade, então você tem que salvar as duas pontas do relacionamento e apontar as referências. O.o

alberson

Valeu pelas respostas, galera.
O meu problema era conceitual, achei que minha tabela era One to One, mas na realidade é One to Many (uma mensagem, várias traduções).
O código ficou assim:

@Entity
@Component
@Table(schema = "public", name = "mensagem")
public class Mensagem implements Serializable {
	@Id
	@Column(name = "mensagem_id")
	private String mensagemId;
	private String mensagem;

	@OneToMany(fetch = FetchType.LAZY, mappedBy="mensagem")
	private Set<MensagemTrl> traducao;

	//getters e setters
}

@Entity
@Component
@Table(schema = "public", name = "mensagem_trl")
public class MensagemTrl implements Serializable {
	@Column(name = "mensagem_trl_id")
	private String mensagemTrlId
	@Column(name = "mensagem_id)
	private String mensagemId;
	private char traduzido;
	private String mensagem;
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="ad_message_id", nullable = false, insertable = false, updatable = false)
	private Mensagem mensagem;
	//getters e setters
}

E no JSP

<c:forEach items="${messageList }" var="msg">
	<tr>
		<td>${msg.mensagemId }</td>
		<td>${msg.mensagem }</td>
		<c:forEach items="${msg.traducao}" var="trd">
			<td>${trd.mensagemId}</td>
			<td>${trd.mensagem }</td>
		</c:forEach>
	</tr>
</c:forEach>
Criado 28 de maio de 2012
Ultima resposta 29 de mai. de 2012
Respostas 3
Participantes 3