JPA & JBoss
Par PlaceOweb le samedi, juin 16 2012, 16:14 - JAVA - Lien permanent
Comment utiliser JPA sous JBoss ?
- Java Persistence API Java Persistence API
- JPA (Java Persistence API)
- Java Persistence API (JPA) a pour objectif d'offrir un modèle d'ORM (Object Relational Mapping)
- doc JBoss - Hibernate : Tutorial Using the Java Persistence API (JPA)
- doc JBoss AS7 : JPA Reference Guide
- JPA Queries » Query API » Running Queries
- Query.getSingleResultgetSingleResult()Query's methodExecute a SELECT query that returns a single untyped result.
- Query.getResultList - for general use in any other case.
Using JPA » CRUD Operations » Storing Entities : Storing JPA Entity Objects
- Example of JPA and Hibernate with JBoss and MySql @Entity persistence.xml
- Servlet 3.0 tutorial @WebServlet(name="testServlet", urlPatterns={"/testme"},
- Applications Web : TP Applications web : utilisation d'une base de données
- Création d'un modèle (classe entité) d'Utilisateur et d'un gestionnaire de persistence
- Ajout d'un gestionnaire d'utilisateurs
- Ecriture d'une Servlet / contrôleur web
Les multiples persistence-unit au sein d'un même persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="firstPersistenceUnit"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/DsOne</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="update" /> <!-- # Pour regénérer a chaque deployement value = "create-drop" # Pour mettre a jour a chaque deployement value = "update" --> </properties> </persistence-unit> <!-- 14:22:03,397 INFO [org.jboss.jpa.deployment.PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=MyProject.ear/MyEjbProject.jar#firstPersistenceUnit 14:22:03,398 INFO [org.hibernate.ejb.Ejb3Configuration] Processing PersistenceUnitInfo [ name: firstPersistenceUnit ...] --> <persistence-unit name="secondPersistenceUnit"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/DsTwo</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence>
- Two Persistence Unit in one Persistence.xml You need to specify a persistence unit : @PersistenceContext(unitName="...") in the Ejb
- Two persistance-unit at persistence.xml for two database but its thows exception
- How to define two persistence units (one for production, one for unit testing)?
- Multiple datasources and persistence units
- Multiple Persistence Units with Spring and JPA Always specify the persistence unit name when using the PersistenceContext annotation to inject an entity manager into a class that is part of the module: @PersistenceContext(unitName = "myunit") private EntityManager entityManager;
- javax.persistence : Annotation Type PersistenceContext
- unitName : (Optional) The name of the persistence unit as defined in the persistence.xml file. If the unitName element is specified, the persistence unit for the entity manager that is accessible in JNDI must have the same name.
- API specification for version 6 of the JavaTM Platform, Enterprise Edition
- Introducing the Java EE 6 Platform: Part 3
- JPA Caching
- Architecture des S.I. : JPA
- Type de données JPA et Hibernate Typage des propriétés et colonnes simples. Pour pouvoir choisir efficacement un type de données il faut :
- comprendre les nuances entre les différents types
- être capable pour une donnée du monde réel (la valeur que l'on veut stocker) de distinguer les différentes nuances associées aux différents types
- Type de données JPA et Hibernate Typage des propriétés et colonnes simples. Pour pouvoir choisir efficacement un type de données il faut :
Par exemple, un double et un BigDecimal représentent tout les deux un nombre décimal. Alors que le double ne connaît pas de limite à sa précision : la même variable peut contenir un nombre précis à 2 ou 10 chiffres après la virgule, ce n'est pas le cas d'un BigDecimal, cet objet possède un attribut précision qui indique le nombre de chiffres après la virgule. Pour changer sa précision il faut faire appel à une méthode.
Pour un float, 1,23 et 1,230 sont identiques, ce n'est pas le cas pour un BigDecimal car l'attribut précision n'est pas le même.
// un "decimal(3,1)" Mysql sera définie comme cela avec les attributs Java JPA @Column(name="JLTS_AMOUNT", precision=3, scale=1)
Types :
- BigDecimal : Montant Monétaire + Taux et Pourcentage
- double : Mesure
- long : Quantité entière
- String : Chaîne de caractères (avec l'attibut "length=10" si l'on veut un "varchar(10)" à la place du "varchar(255)" par défaut, et @Lob() pour text)
- Date : Dates avec l'annotation JPA Temporal qui permet de limiter la précision au jour (DATE), à l'heure (TIME) où une précision extrême et complète (TIMESTAMP)
Les types Java acceptent s'ils sont d'un type objets (BigDecimal, Double, Long...) la valeur Null ce qui n'est pas le cas des types natifs (double, long, integer...). Le type String accepte la valeur Null.
D'un point de vu technique, il n'est pas judicieux d'utiliser un type natif si la colonne ne possède pas l'attribut Not Null : on risque des problèmes ou des incohérences si on récupère une valeur Null.
S'il faut une règle simple : je donnerai la règle suivante : Le null est utile si la valeur par défaut du champ ne peut pas être 0, dans les autres cas, il sera préférable de ne pas utiliser de Null.
Note sur les exceptions
MyTableObject myTableObject = new MyTableObject (); try { System.out.println("created new myTableObject "); em.persist(myTableObject); System.out.println("persisted new myTableObject "); System.out.println(myTableObject.getId()); System.out.println("finished new myTableObject "); myTableObject.setNom("mon texte plus grand que l varchar(10) de la colonne"); // Data too long for column 'nom' at row 1 em.persist(myTableObject); System.out.println("myTableObject changed name"); System.out.println("flushing"); em.flush(); System.out.println("flushed"); } catch (Exception e) { // !!! L'exception "Data too long" n'est pas catchée ici, sauf si l'on flush ici !!! System.out.println("Exception in manager"); e.printStackTrace(); }
JPA @EJB find()
// get l'objet/table ayant en clé primaire : 1 MonObjet monObjet = em.find(MonObjet.class, 1);
- Les EJB 3
- JPA (Java Persistence API)
- Présentation du tutorial sur le mapping par annotations des EJB Entité 3.0
- Using JPA » CRUD Operations » Retrieving JPA Entity Objects
The Java EE Tutorial
- The Java EE 6 Tutorial : Managing Entities
- The Java EE 5 Tutorial : Managing Entities