Maison  >  Article  >  Java  >  Introduction détaillée à Hibernate pour l'apprentissage de la gestion des transactions Java

Introduction détaillée à Hibernate pour l'apprentissage de la gestion des transactions Java

黄舟
黄舟original
2017-03-27 10:28:101564parcourir

Hibernate est une encapsulation légère de jdbc. Elle n'a pas la capacité de gérer les transactions, elle est généralement confiée à jdbc et jta sous-jacents pour terminer la planification. L'article suivant vous présente principalement les informations pertinentes sur l'apprentissage de la gestion des transactions Hibernate pour Java. Les amis dans le besoin peuvent s'y référer.

Environnement et version

version hibernate : Hibernate 4.2.2 (Le nom du fichier téléchargé est hibernate-release-4.2.2 .Final.zip, décompresser le répertoire hibernate-release-4.2.2.Final)

Base de données : Oracle 10g

Importer tous les packages jar dans librequired

Description théorique

1. SessionFactory est responsable de la création de SessionFactory et est thread-safe. Plusieurs threads simultanés peuvent accéder à une SessionFactory en même temps. et à partir de celle-ci. Obtenez l'instance de session

2. La session, en tant que noyau du gestionnaire de persistance dans Hibernate, fournit de nombreuses méthodes de persistance, telles que save(), update, delete, find (a été annulée dans Hibernate 3 Cette méthode), etc., grâce à ces méthodes, nous pouvons compléter de manière transparente l'ajout, la suppression et la modification de objet (CRUD-- créer, lire, mettre à jour, supprimer La soi-disant transparence signifie ici que la session). lit, crée et supprime Lors du mappage d'une instance d'un objet entité, cette série d'opérations sera convertie en opérations d'ajout, de modification, d'interrogation et de suppression de données dans la table de base de données.

La session a les caractéristiques suivantes

 1) Elle n'est pas thread-safe et plusieurs threads doivent éviter de partager la même instance de session

 2) Les instances de session sont légères. Ce qu'on appelle la légèreté signifie que leur création et leur suppression ne nécessitent pas trop de ressources

 3) Il y a un cache à l'intérieur de l'objet Session, appelé premier cache d'Hibernate, il stocke les objets chargés dans l'unité de travail actuelle et chaque instance de session possède son propre cache.

3. Le cache de session Hibernate est appelé le cache de premier niveau d'Hibernate. Le cache externe de SessionFactory est appelé cache de deuxième niveau d'Hibernate. Les deux caches sont situés dans la couche de persistance et stockent des copies des données de la base de données. Le cache intégré de SessionFactory stocke les métadonnées et le SQL prédéfini. Le cache intégré de SessionFactory est un cache en lecture seule.

4. Les trois fonctions principales du cache Hibernate Session :

 1) Réduire la fréquence d'accès à la base de données et améliorer les performances d'accès.

 2) Assurez-vous que les objets dans le cache sont synchronisés avec la base de données. Les objets dans le cache sont appelés objets persistants.

 3) Lorsqu'il y a une association entre des objets persistants, Session garantit qu'aucun blocage du graphe d'objets ne se produira.

Comment Session détermine-t-il le changement d'état de l'objet persistant ?

Une fois que la session aura chargé l'objet, elle copiera un instantané des propriétés de type valeur de l'objet. Lorsque la session efface le cache, elle compare l'objet actuel avec son instantané pour voir quelles propriétés ont changé.

5. Quand la Session vide-t-elle son cache ?

 1) Lorsque la méthode commit() est appelée

 2) Le cache sera vidé lors de l'interrogation pour garantir que les résultats de la requête peuvent refléter le dernier état du objet.

 3) Afficher la méthode de vidage de la session.

Cas particulier de vidage du cache de session :

Lorsque l'objet utilise le générateur natif, le cache sera immédiatement vidé et les enregistrements seront insérés dans la base de données.

Exemple de code

Le répertoire de codes testé est le suivant :

Introduction détaillée à Hibernate pour l'apprentissage de la gestion des transactions Java

hibernate.cfg.xml


<?xml version="1.0"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
 <session-factory> 
 <property name="show_sql">true</property> 
 <property name="hibernate.connection.driver_class"> 
  oracle.jdbc.driver.OracleDriver 
 </property> 
 <property name="hibernate.connection.url"> 
  jdbc:oracle:thin:@XX.26.158.43:1521:orcl 
 </property> 
 <property name="hibernate.connection.username"></property> 
 <property name="hibernate.connection.password"></property> 
 <property name="dialect">org.hibernate.dialect.OracleDialect</property> 
  
 <mapping resource="com/oscar999/trans/hibernate/Product.hbm.xml"/> 
 </session-factory> 
</hibernate-configuration>

Product.java

/** 
 * @Title: Product.java 
 * @Package com.oscar999.trans.hibernate 
 * @Description: 
 * @author XM 
 * @date Feb 15, 2017 1:44:47 PM 
 * @version V1.0 
 */ 
package com.oscar999.trans.hibernate; 
 
import java.io.Serializable; 
 
/** 
 * @author XM 
 * 
 */ 
public class Product implements Serializable { 
 
 public Product() { 
 } 
 
 private Integer id; 
 
 private String name; 
 
 private String price; 
 
 private static final long serialVersionUID = 1L; 
 
 public Integer getId() { 
 return id; 
 } 
 
 public void setId(Integer id) { 
 this.id = id; 
 } 
 
 public String getName() { 
 return name; 
 } 
 
 public void setName(String name) { 
 this.name = name; 
 } 
 
 public String getPrice() { 
 return price; 
 } 
 
 public void setPrice(String price) { 
 this.price = price; 
 } 
 
}

Product.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" > 
<hibernate-mapping> 
 <class name="com.oscar999.trans.hibernate.Product" table="TEST_PRODUCT"> 
 <id name="id" column="id" type="java.lang.Integer"> 
  <generator class="assigned" /> 
 </id> 
 <property name="name" column="name" type="java.lang.String" 
  not-null="true" unique="true" length="20" /> 
 <property name="price" column="price" type="java.lang.String" 
  not-null="false" unique="false" length="20" /> 
 </class> 
</hibernate-mapping>

TestMain.Java

/** 
 * @Title: TestMain.java 
 * @Package com.oscar999.trans.hibernate 
 * @Description: 
 * @author XM 
 * @date Feb 15, 2017 2:02:17 PM 
 * @version V1.0 
 */ 
package com.oscar999.trans.hibernate; 
 
import java.io.File; 
 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 
import org.hibernate.service.ServiceRegistryBuilder; 
 
/** 
 * @author XM 
 * 
 */ 
public class TestMain { 
 
 /** 
 * @param args 
 */ 
 
 public Session getSession() { 
 Session session = null; 
 Configuration conf = new Configuration().configure(new File("src/com/oscar999/trans/hibernate/hibernate.cfg.xml")); 
 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry(); 
 SessionFactory sf = conf.buildSessionFactory(serviceRegistry); 
 session = sf.openSession(); 
 return session; 
 } 
 
 public void addProduct(Session session, String name, String price) { 
 Transaction t = session.beginTransaction(); // 1. comment1 
 Product product = new Product(); 
 product.setId(1); 
 product.setName(name); 
 product.setPrice(price); 
 try { 
  session.save(product); 
  t.commit(); // 2. comment2 
 } catch (Exception e) { 
  t.rollback(); 
 } 
 } 
 
 public static void main(String[] args) { 
 // TODO Auto-generated method stub 
 TestMain testMain = new TestMain(); 
 Session session = testMain.getSession(); 
 testMain.addProduct(session, "product1", "price1"); 
 if (session != null && session.isOpen()) { 
  session.close(); 
 } 
 } 
 
}

Explication :

1. 89b23af23007b3147b7d591facc60d37

La stratégie de génération. de l'identifiant est Spécifiez-le vous-même, donc il y a product.setId(1); dans le code, sinon il ne peut pas être ajouté avec succès

2 Transaction t = session.beginTransaction();

Hibernate lui-même ne le fait pas. implémenter sa propre fonction de gestion des transactions ; Encapsulation légère des transactions JDBC ou JTA sous-jacentes

3.Hibernate peut être configuré en tant que JDBCTransaction ou JTATransaction, selon votre configuration dans hibernate.properties :

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory 
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

Si vous ne configurez rien, JDBCTransaction est utilisé par défaut

4 En Hibernate, lorsque la session est ouverte, elle le sera automatiquement conn.setAutoCommit(false) , contrairement à JDBC ordinaire, qui par défaut est vrai. , donc peu importe si vous n'écrivez pas de commit à la fin. Étant donné qu'Hibernate a désactivé AutoCommit, lorsque vous utilisez Hibernate, si vous n'écrivez pas Transaction dans le programme, la base de données ne répondra pas du tout.

La relation entre JDBC et Hibernate dans le traitement des transactions

Hibernate lui-même n'implémente pas sa propre fonction de gestion des transactions, mais est une encapsulation légère de la transaction JDBC ou JTA sous-jacente transaction

Introduction détaillée à Hibernate pour l'apprentissage de la gestion des transactions Java

JTA

JTA来管理跨Session的长事务,那么就需要使用JTATransaction

javax.transaction.UserTransaction tx = new InitialContext();.lookup("javax.transaction.UserTransaction");;


Session s1 = sf.openSession();;
...
s1.flush();;
s1.close();;


...


Session s2 = sf.openSession();;
...
s2.flush();;
s2.close();;


tx.commit();;

Hibernate Transaction是从Session中获得的,tx = session.beginTransaction() ,最后要先提交tx,然后再session.close,这完全符合JDBC的Transaction的操作顺序,但是这个顺序是和JTA的Transactioin操作顺序彻底矛盾的!!! JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction,因此当你使用JTA的Transaction的时候,那么就千万不要使用Hibernate的Transaction,而是应该像我上面的JTA的代码片断那样使用才行。

总结

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn