Olá amigos, comecei a criar um projeto do zero usando JSF + Primefaces + JPA + Hibernate e possuo um duvida.
1 - Possuo uma Entidade Fabricante, aonde essa entidade vai se relaciona com outra entidade só que já consigo persisitir o objeto normalmente, o meu problema é quando vou informar um nome de um Fabricante por exemplo Toyota, caso o nome já esteja no banco e caso tentar salvar o mesmo nome irei ficar com 2 objetos ex: Toyota / ToYoTa como faço para resolver isso?
OBS: Estou usando o lombook. Portanto, não está explicito as anotações @getters e @setter.
Segue meu código:
package com.irmaosuspension.controleservico.modelo;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotBlank;
import lombok.Data;
@Entity
@Data
public class Fabricante implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigo;
@NotNull
@NotBlank
@Size(max= 30,min = 4) //tamanho de caractere
@Column(nullable = false, length=30) //coluna não pode ser null e o tamanho da coluna é 20
private String nome;
@Transient
public boolean isFabricanteNovo(){
return this.getCodigo() == null;
}
public boolean isExistente(){
return !isFabricanteNovo();
}
}
Meu DAO
package com.irmaosuspension.controleservico.dao;
import java.io.Serializable;
import java.util.List;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import com.irmaosuspension.controleservico.jpa.Transactional;
import com.irmaosuspension.controleservico.modelo.Fabricante;
import com.irmaosuspension.controleservico.util.NegocioException;
public class FabricanteDAO implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager em;
@Transactional
public void salvar(Fabricante fabricante) {
em.merge(fabricante);
}
public List<Fabricante> buscarTodos() {
return em.createQuery("from Fabricante order by nome", Fabricante.class).getResultList();
}
@Transactional
public void excluir(Fabricante fabricante) throws NegocioException {
try {
Fabricante fabricanteTemp = this.buscarPeloCodigo(fabricante.getCodigo());
em.remove(fabricanteTemp);
em.flush();
} catch (PersistenceException e) {
throw new NegocioException("Fabricante não pode ser excluído.");
}
}
public Fabricante buscarPeloCodigo(Long codigo) {
return em.find(Fabricante.class, codigo);
}
}
Meu Service
package com.irmaosuspension.controleservico.service;
import java.io.Serializable;
import java.util.List;
import javax.inject.Inject;
import com.irmaosuspension.controleservico.dao.FabricanteDAO;
import com.irmaosuspension.controleservico.modelo.Fabricante;
import com.irmaosuspension.controleservico.util.NegocioException;
public class FabricanteService implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private FabricanteDAO fabricanteDAO;
public void salvar(Fabricante fabricante) throws NegocioException {
try{
this.fabricanteDAO.salvar(fabricante);
}
catch (Exception e) {
throw new NegocioException("Não foi possível salvar o Fabricante");
}
}
public List<Fabricante> buscarTodos() {
return fabricanteDAO.buscarTodos();
}
public void excluir(Fabricante fabricante) throws NegocioException {
try {
fabricanteDAO.excluir(fabricante);
} catch (Exception e) {
System.out.println(e.getMessage());
throw new NegocioException("Não foi possível excluir o Fabricante!");
}
}
}
Meu Controller
package com.irmaosuspension.controleservico.controller;
import java.io.Serializable;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.omnifaces.util.Messages;
import com.irmaosuspension.controleservico.modelo.Fabricante;
import com.irmaosuspension.controleservico.service.FabricanteService;
import com.irmaosuspension.controleservico.util.NegocioException;
import lombok.Getter;
import lombok.Setter;
@Named
@ViewScoped
public class CadastroFabricanteBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private FabricanteService cadastroFabricanteService;
@Getter
@Setter
private Fabricante fabricante;
public void inicializar() {
System.out.println("iniciando Fabricante..");
if (this.fabricante == null) {
limpar();
}
}
public void salvar()throws NegocioException {
try {
this.cadastroFabricanteService.salvar(fabricante);
Messages.addGlobalInfo("Fabricante salvo com sucesso!");
limpar();
} catch (NegocioException e) {
Messages.addGlobalError(e.getMessage());
}
}
public boolean isEditando() {
return this.fabricante.getCodigo() != null;
}
private void limpar() {
this.fabricante = new Fabricante();
}
}