package erp.banco;
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.PersistenceContext;
import erp.usuario.Usuario;
@SuppressWarnings("serial")
@PersistenceContext(unitName = "erp")
@Entity
public class Banco implements Serializable {
@Column(unique = true, length = 10, nullable = true)
private String codigo;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, length = 50, nullable = false)
private String nome;
private Usuario usuarioOperacao;
public String getCodigo() {
return this.codigo;
}
public Long getId() {
return this.id;
}
public String getNome() {
return this.nome;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public void setId(Long id) {
this.id = id;
}
public void setNome(String nome) {
this.nome = nome;
}
@Override
public String toString() {
return this.nome;
}
}
/****************************************************************************************/
@Override
public void salvarRegistro(Banco banco) {
EntityManager entityManager = JPA.getEntityManagerFactory().createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
try {
entityTransaction.begin();
entityManager.merge(banco);
entityTransaction.commit();
} catch (PersistenceException p) {
if (p.getMessage().contains("ConstraintViolationException")) {
if (p.getMessage().contains("nome")) { // Tem como saber que foi esse o atributo da excessão ?
Msg.avisoCampoDuplicado("NOME");
} else if (p.getMessage().contains("codigo")) { // Tem como saber que foi esse o atributo da excessão ?
Msg.avisoCampoDuplicado("CÓDIGO");
} else {
Msg.avisoCampoDuplicado();
}
}
p.printStackTrace();
entityTransaction.rollback();
throw p;
}catch (Exception e) {
e.printStackTrace();
entityTransaction.rollback();
} finally {
entityManager.close();
}
}
// o código funciona só não pega qual o atributo da classe gerou a exceção ConstraintViolationException
Tem como saber qual o atributo da classe para informar o usuário ao pegar uma ConstraintViolationException ? [Resolvido]
3 Respostas
O código até que está capturando a exceção corretamente, o que eu quero saber é se tem como pegar se foi o nome do Banco que está duplicado ao cadastrar ou se foi o código do banco que está duplicado ao cadastrar ?
package erp.banco;
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.Index;
import javax.persistence.PersistenceContext;
import javax.persistence.Table;
import erp.usuario.Usuario;
@SuppressWarnings("serial")
@PersistenceContext(unitName = "erp")
@Entity
@Table(indexes = { @Index(name = "INDEX_NOME", columnList = "nome", unique = true),
@Index(name = "INDEX_CODIGO", columnList = "codigo", unique = true) })
public class Banco implements Serializable {
@Column(length = 10, nullable = true)
private String codigo;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 50, nullable = false)
private String nome;
public String getCodigo() {
return this.codigo;
}
public Long getId() {
return this.id;
}
public String getNome() {
return this.nome;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public void setId(Long id) {
this.id = id;
}
public void setNome(String nome) {
this.nome = nome;
}
@Override
public String toString() {
return this.nome;
}
}
/***********************************************************************************/
@Override
public void salvarRegistro(Banco banco) {
EntityManager entityManager = JPA.getEntityManagerFactory().createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
try {
entityTransaction.begin();
entityManager.merge(banco);
entityTransaction.commit();
} catch (Exception e) {
Throwable throwable = e.getCause().getCause();
String mensagem = throwable.toString();
if (mensagem.contains("ConstraintViolationException")) {
if (mensagem.contains("INDEX_NOME")) {
Msg.avisoCampoDuplicado("NOME");
} else if (mensagem.contains("INDEX_CODIGO")) {
Msg.avisoCampoDuplicado("CÓDIGO");
} else {
Msg.avisoCampoDuplicado();
}
}
e.printStackTrace();
entityTransaction.rollback();
throw e;
} finally {
entityManager.close();
}
}
Resolvido.
Criado 11 de maio de 2019
Ultima resposta 11 de mai. de 2019
Respostas 3
Participantes 1
Alura POO: o que é programação orientada a objetos? Aprenda os conceitos básicos da programação orientada a objetos, como classes, objetos, herança, encapsulamento e polimorfismo, com exemplos.
Casa do Codigo Desbravando SOLID: Praticas avancadas para codigos de... Por Alexandre Aquiles — Casa do Codigo