Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/01/2012, 15h39   #1
Membre du Club
 
Inscription : juin 2009
Messages : 125
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 125
Points : 49
Points : 49
Par défaut Comment catcher des violations de contraintes avec JPA

Bonjour,

Je cherche à catcher des violations contraintes SQL (clé unique, longueur excesive, ...) via JPA.

Actuellement si je catch des exception au moment du persist() de l'EntityManager, j’obtiens une RollBackException qui est levé par mon implémentation JPA : EclipseLink (org.eclipse.persistence.exceptions.DatabaseException) qui elle même est levé à cause d'une exception de mon implémentation du driver JDBC (com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'LOGIN' at row 1).

Moi je cherche à catcher ce type d'exception sans qu'elle soit spécifique à une implémentation.
J'ai vu que JPA avait des PersistenceException mais je ne les catchent jamais.

Il y a t-il un moyen de bien filtrer les exceptions de persistence ?

Voici un peu de code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@XmlRootElement
@Entity
@Table(name = "t_customer")
public class Customer implements Serializable {
 
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
 
	@Column(unique = true, nullable = false, length = 8)
	private String login;
 
	@Column(nullable = false, length = 8)
	private String password;
 
	// getter & setter
}
Mon services :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@Path("/customers")
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public class CustomersResource {
 
	@PersistenceContext(unitName = "monPU")
	private EntityManager em;
 
	@Resource
	private UserTransaction ut;
 
	@Context
	private UriInfo uriInfo;
 
	// logger declaration
 
	@POST
	public Response createCustomer(Customer customer) {
 
		if (null == customer)
			throw new WebApplicationException(Response
					.status(Status.BAD_REQUEST).entity("Customer is null !")
					.type(MediaType.TEXT_PLAIN).build());
 
		// Insert a Customer entity into Database using EntityManager
		try {
			ut.begin();
 
			em.setFlushMode(FlushModeType.COMMIT);
 
			em.persist(customer);
 
			ut.commit();
		} catch (RollbackException re) {
			try {
				if (ut.getStatus() != javax.transaction.Status.STATUS_NO_TRANSACTION)
					ut.rollback();
			} catch (SystemException se) {
				logger.log(Level.SEVERE, "[Rollback SystemException]", se);
			}
			logger.log(Level.WARNING, "[ROLLBACK]", re); // RollBackException
			logger.log(Level.WARNING, "[ROLLBACK CAUSE]", re.getCause()); // DatabaseException (EclipseLink)
		} catch (Exception e) {
			logger.log(Level.WARNING, "[CreateUser Exception]", e);
		}
 
		System.out.println(customer);
		URI customerURI = uriInfo.getAbsolutePathBuilder().build();
		return Response.created(customerURI).build();
	}
	// autres methodes CRUD
}
Trace:
Code :
1
2
3
4
5
ATTENTION: Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'LOGIN' at row 1
Error Code: 1406
Call: INSERT INTO ........................................
Pour info, J'utilise GlassFish 3.1.1 comme serveur d'application.
Aure7780 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/02/2012, 18h38   #2
Membre du Club
 
Inscription : avril 2010
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 65
Points : 41
Points : 41
Je ne sais pas si ça pourra t'aider mais j'ai posté tout à l'heure (c'est résolu maintenant et il y a tout le code) sur le même sujet à la différence que c'est une ConstraintViolationException que j'ai du catcher (par l'intermédiaire du rollback). Voici l'url de la page :

http://www.developpez.net/forums/d11...tique-methode/
dr-Padbol est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h58.


 
 
 
 
Partenaires

Hébergement Web