Hibernate ist eine leichte Kapselung von JDBC. Es verfügt nicht über die Fähigkeit, Transaktionen zu verwalten. Auf der Ebene der Transaktionsverwaltung wird die Planung im Allgemeinen dem zugrunde liegenden JDBC und JTA anvertraut. Der folgende Artikel führt Sie hauptsächlich in die relevanten Informationen von Hibernate für das Erlernen der Java-Transaktionsverwaltung ein.
Umgebung und Version
Ruhezustandsversion: Hibernate 4.2.2 (Der heruntergeladene Dateiname lautet hibernate-release-4.2.2 .Final.zip, entpacken Sie das Verzeichnis hibernate-release-4.2.2.Final)
Datenbank: Oracle 10g
Alle JAR-Pakete in librequired importieren
Theoretische Beschreibung
1. SessionFactory ist für die Thread-Sicherheit verantwortlich. Mehrere gleichzeitige Threads können gleichzeitig auf eine SessionFactory zugreifen und daraus. Sitzungsinstanz abrufen
2. Session bietet als Kern des Persistenzmanagers im gesamten Ruhezustand zahlreiche Persistenzmethoden wie save(), update, delete, find (wurde abgebrochen in Mit dieser Methode (Hibernate 3) usw. können wir das Hinzufügen, Löschen und Ändern von Objekten transparent abschließen (CRUD – Erstellen, Lesen, Aktualisieren, Löschen). liest, erstellt und löscht Beim Zuordnen einer Instanz eines Entitätsobjekts wird diese Reihe von Vorgängen in Vorgänge zum Hinzufügen, Ändern, Abfragen und Löschen von Daten in der Datenbanktabelle umgewandelt.
Sitzung hat die folgenden Eigenschaften
1) Sie ist nicht threadsicher und mehrere Threads sollten vermeiden, dieselbe Sitzungsinstanz zu teilen
2) Sitzungsinstanzen sind leichtgewichtig. Das sogenannte Lightweight bedeutet, dass ihre Erstellung und Löschung nicht zu viele Ressourcen erfordert
3) Es gibt einen Cache im Sitzungsobjekt. Er wird als erster Cache von Hibernate bezeichnet und speichert in der aktuellen Arbeitseinheit geladene Objekte. Jede Sitzungsinstanz verfügt über einen eigenen Cache.
3. Der Hibernate-Sitzungscache wird als Hibernate-Cache der ersten Ebene bezeichnet. Der externe Cache von SessionFactory wird als Second-Level-Cache von Hibernate bezeichnet. Beide Caches befinden sich in der Persistenzschicht und speichern Kopien von Datenbankdaten. Der integrierte Cache von SessionFactory speichert Metadaten und vordefiniertes SQL. Der integrierte Cache von SessionFactory ist ein schreibgeschützter Cache.
4. Die drei Hauptfunktionen des Hibernate-Sitzungscaches:
1) Reduzieren Sie die Häufigkeit des Datenbankzugriffs und verbessern Sie die Zugriffsleistung.
2) Stellen Sie sicher, dass die Objekte im Cache mit der Datenbank synchronisiert sind. Die Objekte im Cache werden als persistente Objekte bezeichnet.
3) Wenn eine Verbindung zwischen persistenten Objekten besteht, garantiert die Sitzung, dass kein Deadlock des Objektdiagramms auftritt.
Wie bestimmt Session die Zustandsänderung des persistenten Objekts?
Nachdem die Sitzung das Objekt geladen hat, wird eine Momentaufnahme der Werttypeigenschaften des Objekts kopiert. Wenn die Sitzung den Cache löscht, vergleicht sie das aktuelle Objekt mit seinem Snapshot, um zu sehen, welche Eigenschaften sich geändert haben.
5. Wann löscht die Sitzung ihren Cache?
1) Wenn die commit()
-Methode aufgerufen wird
2) Der Cache wird bei der Abfrage geleert, um sicherzustellen, dass die Abfrageergebnisse den neuesten Status der widerspiegeln können Objekt.
3) Zeigt die Spülmethode der Sitzung an.
Sonderfall des Löschens des Sitzungscache:
Wenn das Objekt den nativen Generator verwendet, wird der Cache sofort geleert und Datensätze werden in die Datenbank eingefügt.
Beispielcode
Das getestete Codeverzeichnis lautet wie folgt:
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(); } } }
Erklärung:
1. Die Generierungsstrategie von id ist Geben Sie es selbst an, also gibt es <generator class="assigned" />
im Code, andernfalls kann es nicht erfolgreich hinzugefügt werden
product.setId(1);
Hibernate selbst funktioniert nicht Implementieren Sie eine eigene Transaktionsverwaltungsfunktion. Leichte Kapselung zugrunde liegender JDBC-Transaktionen oder JTA-Transaktionen.
3.Hibernate kann je nach Konfiguration in hibernate.properties als JDBCTransaction oder JTATransaction konfiguriert werden: Transaction t = session.beginTransaction();
verwendet, im Gegensatz zu gewöhnlichem JDBC, das standardmäßig „true“ ist Daher spielt es keine Rolle, wenn Sie am Ende kein Commit schreiben. Da Hibernate AutoCommit deaktiviert hat, reagiert die Datenbank überhaupt nicht, wenn Sie keine Transaktion in das Programm schreiben.
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory #hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory
Die Beziehung zwischen JDBC und Hibernate bei der Transaktionsverarbeitung
Hibernate selbst implementiert keine eigene Transaktionsverwaltungsfunktion, sondern ist eine leichte Kapselung der zugrunde liegenden JDBC-Transaktion oder JTA Transaktionconn.setAutoCommit(false)
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的代码片断那样使用才行。
总结
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Hibernate zum Erlernen der Java-Transaktionsverwaltung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!