Using JPA » CRUD Operations » Storing Entities : Storing JPA Entity Objects

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>
  • 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

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);

The Java EE Tutorial