Tenho uma tenho um relacionamento OneToOne
, para salvar no banco tudo certo, meu problema é mostra no xhtml
Vou mostrar os Beans
:
Tenho um usuario
@Entity
public class Usuario implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="userId", unique=true, nullable=false)
private Integer userId;
@Column(name="ativo")
private boolean ativo;
@Column(name="userNome")
private String userNome;
@Column(name="login")
private String login;
@Column(name="senha")
private String senha;
@Column(name="email")
private String email;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="equipeId")
private Equipe equipe;
@Column(name="permissaoAcesso")
private int permissaoAcesso;
Tenho esse relacionamento com Equipe:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="equipeId")
private Equipe equipe;
Aqui tem o bean do Equipe:
@Entity
public class Equipe implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="equipeId", unique=true, nullable=false)
private Integer equipeId;
@Column(name="equipeNome")
private String equipeNome;
@Column(name="endereco")
private String endereco;
@Column(name="numero")
private String numero;
@Column(name="bairro")
private String bairro;
@Column(name="cidade")
private String cidade;
@Column(name="estado")
private String estado;
@Column(name="nextel")
private String nextel;
@OneToOne()
private Usuario usuario;
@OneToOne()
private Ocorrencia ocorrencia;
Assim, eu posso mostrar em um output
ou datatable
(etc… ) do primefaces
os dados do usuário , mas eu não sei como fazer para carregar e mostrar dados da equipe relacionado ao usuário que selecionei na tela no JSF
.
Eu entendo que o relacionamento 1 para 1 pode ser:
- Unidirecional
- Bidirecional
Quando é unidirecional, a referência da tabela A está na tabela B. Desta forma, você só consegue achar o registro de A a partir da FK que o referencia em B.
Quando é bidirecional, você pode achar A buscando por A ou pela FK em B e vice-versa.
Qual o caso no teu desenvolvimento? Você vai definir…
Cada usuário possui uma equipe, isso?
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="equipeId")
private Equipe equipe;
Você tem duas opções: ou coloca o relacionamento com fetch EAGER (e sempre que buscar um usuário trará sua equipe junto) ou, antes de enviar os dados para a view, faz nova busca e encontra a equipe.
Problema na segunda abordagem: como encontrar a equipe sem a referência da mesma (já que o relacionamento é unidirecional)?
Eu acredito que uma equipe é formada por (tem) usuários. E cada usuário está em uma equipe, logo, você está interpretando errado esse relacionamento, ele deveria ser 1 para muitos (um usuário está em uma equipe e cada equipe pode ter 0, 1 ou mais usuarios, não?)
Então usuário pode ou não estar em uma equipe, pois existe mais de 1 nível de usuário, é somente 1 tipo nível de usuário é atrelado a uma equipe , como uma equipe pode ou não estar atrelado a um usuário.
Ainda assim, não vejo como 1 para 1, pois essas distinções de usuários já inibem esse tipo de relacionamento.
Consegui resolver:
Dentro do meu bean Usuario eu instanciei objeto da equipe:
Equipe equipe = new Equipe();
Então no XHTML eu fiz assim no datatable (só mostando a coluna equipe):
<p:dataTable id="usuarioDataTable" var="listausuario"
value="#{usuarioManageBean.usuarios}"
rowKey="#{listausuario.userId}"
emptyMessage="Nenhum registro incluido." paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
<p:column headerText="Equipe"
style="text-align: center">
<h:outputText value="#{listausuario.equipe.equipeNome}" />
</p:column>
</p:dataTable>
Pronto, consigo mostrar qualquer informação da entidade equipe atrelado ao usuário que está salvo.