Jpa não gera foreign key @OneToMany

0 respostas
jpa
justino.sousa

Pessoal Boa tarde, to com dificuldades na utilização do jpa com banco de dados mysql

tenho uma entidade Usuário onde ela pode ter um ou mais telefones então criei a classe Telefone e na minha classe usuário referenciei com o relacionamnto OneToMany, quando faço a persistencia da classe o jpa consegue persistir os dados nas duas tabelas porem ele deixa a foreign key que seria o usuario_id na tabela de telefones nullo.

vou deixar os códigos aqui.

@Entity
@Table(name = "usuario")
public class Usuario {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long id;

	@Size(min = 4, max = 15)
	@Column(nullable = false)
	private String nome;

	@Column(nullable = false)
	private String email;

	@Column(nullable = false)
	private String senha;

	@Column(nullable = true)
	@OneToMany(mappedBy ="usuario", cascade = CascadeType.ALL)
	private List<Telefone> telefones;
	
	public Usuario() {
		
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public List<Telefone> getTelefones() {
		return telefones;
	}

	public void setTelefones(List<Telefone> telefones) {
		this.telefones = telefones;
	}
}

e essa é a classe Telefone

@Entity
@Table(name="telefone")
public class Telefone {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long id;
	
	@Size(max = 3)
	@Column(nullable = true)
	private String ddd;
	
	@Size(max = 9)
	@Column(nullable = true)
	private String numero;
	
	@Column(nullable = true)
	private String tipo;
	
	@ManyToOne
	@JoinColumn(nullable = false)
	private Usuario usuario;
	
	
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getDdd() {
		return ddd;
	}

	public void setDdd(String ddd) {
		this.ddd = ddd;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public Usuario getUsuario() {
		return usuario;
	}

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

}

esse é meu MB

@ManagedBean(name = usuarioController)

@ViewScoped

public class UsuarioController {
private Usuario usuario;
private UsuarioDao usuarioDao;
private List<Usuario> usuarios;

private Telefone telefone;
private List<Telefone> telefones;


@PostConstruct
public void init() {
	usuarioDao = new UsuarioDao();
	usuario = new Usuario();
	telefone = new Telefone();
	telefones =  new ArrayList<Telefone>();
			
	try {
		usuarios = usuarioDao.listarUsuarios();
	} catch (Exception e) {
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		context.getExternalContext().getFlash().setKeepMessages(true);
	}
}


public Usuario getUsuario() {
	return usuario;
}

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

public List<Usuario> getUsuarios() {
	return usuarios;
}

public void setUsuarios(List<Usuario> usuarios) {
	this.usuarios = usuarios;
}

public Telefone getTelefone() {
	return telefone;
}


public void setTelefone(Telefone telefone) {
	this.telefone = telefone;
}


public List<Telefone> getTelefones() {
	return telefones;
}

public void setTelefones(List<Telefone> telefones) {
	this.telefones = telefones;
}


public String inserir() {
	try {
		telefones.add(telefone);
		usuario.setTelefones(telefones);
		usuarioDao.inserir(usuario);
		usuarios = usuarioDao.listarUsuarios();
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Usuario cadastrado com Sucesso!"));
		context.getExternalContext().getFlash().setKeepMessages(true);

	} catch (Exception e) {
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		context.getExternalContext().getFlash().setKeepMessages(true);
	}
	return "index";
}

public String atualizar() {
	try {
		usuarioDao.atualizar(usuario);
		usuarios = usuarioDao.listarUsuarios();

		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Lembrete editado com sucesso!"));
		context.getExternalContext().getFlash().setKeepMessages(true);
	} catch (Exception e) {
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		context.getExternalContext().getFlash().setKeepMessages(true);
	}

	return "home";
}

public void selecionar() {

	try {
		usuario = usuarioDao.selecionar(usuario.getId());

		if (usuario == null || usuario.getId() == 0) {
			usuario = new Usuario();
			throw new Exception("Usuário não encontrado.");
		}

	} catch (Exception e) {
		FacesMessage message = new FacesMessage(e.getMessage());
		message.setSeverity(FacesMessage.SEVERITY_ERROR);
		FacesContext.getCurrentInstance().addMessage(null, message);
	}
}

public String remover() {
	try {
		usuarioDao.excluir(usuario.getId());
		usuarios = usuarioDao.listarUsuarios();

		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Lembrete removido com sucesso!"));
		context.getExternalContext().getFlash().setKeepMessages(true);
	} catch (Exception e) {
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		context.getExternalContext().getFlash().setKeepMessages(true);
	}
	return "home";
}

}

e esse é meu XHTML

<h:head>

Adicionar Usuário

</h:head>
<h:body>
<h:messages />
<h:form>
<p:panel header=“Cadastro de usuário”>

<h:panelGrid columns="3">
			<p:outputLabel value="Nome:" />
			<p:inputText id="nome" value="#{usuarioController.usuario.nome}" required="true">
				<f:validateLength minimum="3" maximum="255" />
			</p:inputText>
			<h:message for="nome" />

			<p:outputLabel value="Email:" />
			<p:inputText id="email" value="#{usuarioController.usuario.email}" required="true">
				<f:validateLength minimum="3" maximum="255" />
			</p:inputText>
			<h:message for="email" />

			<p:outputLabel value="Senha:" />
			<p:password id="senha" value="#{usuarioController.usuario.senha}" required="true">
			</p:password> 
			<h:message for="senha" />
			
			<p:outputLabel value="Telefone:" />
			<h:panelGrid columns="6">	
			<p:outputLabel value="ddd"></p:outputLabel>
			<p:inputText id="ddd" value="#{usuarioController.telefone.ddd}" required="true"> </p:inputText> 
			<p:outputLabel value="numero"></p:outputLabel>
			<p:inputText id="telefone" value="#{usuarioController.telefone.numero}" required="true"> </p:inputText> 
			<p:outputLabel for="tipo" value="Tipo:" />
	        <p:selectOneRadio id="tipo" value="#{usuarioController.telefone.tipo}" unselectable="true">
	            <f:selectItem itemLabel="Fixo" itemValue="Fixo" />
	            <f:selectItem itemLabel="movel" itemValue="Movel" />
	        </p:selectOneRadio>
			<h:message for="telefone" />
			</h:panelGrid>
		</h:panelGrid>

		<p:commandButton value="Enviar" action="#{usuarioController.inserir}" />
	</p:panel>
</h:form>

</h:body>

Criado 11 de outubro de 2020
Respostas 0
Participantes 1