Hibernate.orgCommunity Documentation
ä½¿ç¨ Hibernate å° 100,000 æ¡è®°å½æå ¥å°æ°æ®åºçä¸ä¸ªå¾å¤©ççåæ³å¯è½æ¯è¿æ ·çï¼
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
}
tx.commit();
session.close();
è¿æ®µç¨åºå¤§æ¦è¿è¡å° 50ï¼000 æ¡è®°å½å·¦å³ä¼å¤±è´¥å¹¶æåºå
åæº¢åºå¼å¸¸ï¼OutOfMemoryExceptionï¼
ãè¿æ¯å 为 Hibernate ææææ°æå
¥ç客æ·ï¼Customerï¼
å®ä¾å¨ session 级å«çç¼ååºè¿è¡äºç¼åçç¼æ
ã
æä»¬ä¼å¨æ¬ç« åè¯ä½ å¦ä½é¿å æ¤ç±»é®é¢ãé¦å ï¼å¦æä½ è¦æ§è¡æ¹éå¤ç并䏿³è¦è¾¾å°ä¸ä¸ªçæ³çæ§è½ï¼é£ä¹ä½¿ç¨ JDBC çæ¹éï¼batchingï¼åè½æ¯è³å ³éè¦ãå° JDBC çæ¹éæåæ°éï¼batch sizeï¼åæ°è®¾ç½®å°ä¸ä¸ªåéå¼ï¼æ¯å¦ï¼10 - 50 ä¹é´ï¼ï¼
hibernate.jdbc.batch_size 20
注æï¼åè¥ä½ 使ç¨äº identiy
æ è¯ç¬¦çæå¨ï¼Hibernate å¨ JDBC 级å«éæçå
³éæå
¥è¯å¥çæ¹éæ§è¡ã
ä½ ä¹å¯è½æ³å¨æ§è¡æ¹éå¤çæ¶å®å ¨å ³éäºçº§ç¼åï¼
hibernate.cache.use_second_level_cache false
使¯ï¼è¿ä¸æ¯ç»å¯¹å¿
é¡»çï¼å 为æä»¬å¯ä»¥æ¾å¼è®¾ç½® CacheMode
æ¥å
³éä¸äºçº§ç¼åç交äºã
妿è¦å°å¾å¤å¯¹è±¡æä¹
åï¼ä½ å¿
é¡»éè¿ç»å¸¸çè°ç¨ flush()
以åç¨åè°ç¨ clear()
æ¥æ§å¶ç¬¬ä¸çº§ç¼åç大å°ã
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
æ¤æ¹æ³åæ ·éç¨äºæ£ç´¢åæ´æ°æ°æ®ãæ¤å¤ï¼å¨è¿è¡ä¼è¿åå¾å¤è¡æ°æ®çæ¥è¯¢æ¶ï¼ä½ éè¦ä½¿ç¨ scroll()
æ¹æ³ä»¥ä¾¿å
åå©ç¨æå¡å¨ç«¯æ¸¸æ æå¸¦æ¥ç好å¤ã
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
if ( ++count % 20 == 0 ) {
//flush a batch of updates and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
ä½ä¸ºéæ©ï¼Hibernate æä¾äºåºäºå½ä»¤ç APIï¼å¯ä»¥ç¨ detached object çå½¢å¼ææ°æ®ä»¥æµçæ¹æ³å å
¥å°æ°æ®åºï¼æä»æ°æ®åºè¾åºãStatelessSession
没ææä¹
åä¸ä¸æï¼ä¹ä¸æä¾å¤å°é«å±ççå½å¨æè¯ä¹ãç¹å«æ¯ï¼æ ç¶æ session ä¸å®ç°ç¬¬ä¸çº§ cacheï¼ä¹ä¸å第äºçº§ç¼åï¼æè
æ¥è¯¢ç¼å交äºãå®ä¸å®ç°äºå¡ååï¼ä¹ä¸å®ç°èæ°æ®æ£æ¥ãç¨ stateless session è¿è¡çæä½çè³ä¸çº§èå°å
³èå®ä¾ãstateless session 忽ç¥éåç±»ï¼Collectionsï¼ãéè¿ stateless session è¿è¡çæä½ä¸è§¦å Hibernate çäºä»¶æ¨¡å忦æªå¨ãæ ç¶æ session å¯¹æ°æ®çæ··æ·ç°è±¡å
ç«ï¼å ä¸ºå®æ²¡æç¬¬ä¸çº§ç¼åãæ ç¶æ session æ¯ä½å±çæ½è±¡ï¼åä½å± JDBC ç¸å½æ¥è¿ã
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
session.update(customer);
}
tx.commit();
session.close();
注æå¨ä¸é¢çä¾åä¸ï¼æ¥è¯¢è¿åç Customer
å®ä¾ç«å³è¢«è±ç®¡ï¼detachï¼ãå®ä»¬ä¸ä»»ä½æä¹
åä¸ä¸æé½æ²¡æå
³ç³»ã
StatelessSession
æ¥å£å®ä¹ç insert(), update()
å delete()
æä½æ¯ç´æ¥çæ°æ®åºè¡çº§å«æä½ï¼å
¶ç»ææ¯ç«å»æ§è¡ä¸æ¡ INSERT, UPDATE
æ DELETE
è¯å¥ãå æ¤ï¼å®ä»¬çè¯ä¹å Session
æ¥å£å®ä¹ç save(), saveOrUpdate()
ådelete()
æä½æå¾å¤§çä¸åã
As already discussed, automatic and transparent object/relational mapping is concerned with the management of the object state. The object state is available in memory. This means that manipulating data directly in the database (using the SQL Data Manipulation Language
(DML) the statements: INSERT
, UPDATE
, DELETE
) will not affect in-memory state. However, Hibernate provides methods for bulk SQL-style DML statement execution that is performed through the Hibernate Query Language (HQL).
UPDATE
å DELETE
è¯å¥çä¼ªè¯æ³ä¸ºï¼( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?
ã
è¦æ³¨æçäºé¡¹ï¼
å¨ FROM åå¥ï¼from-clauseï¼ä¸ï¼FROM å ³é®åæ¯å¯éç
å¨ FROM åå¥ï¼from-clauseï¼ä¸åªè½æä¸ä¸ªå®ä½åï¼å®å¯ä»¥æ¯å«åã妿å®ä½åæ¯å«åï¼é£ä¹ä»»ä½è¢«å¼ç¨ç屿§é½å¿ é¡»å 䏿¤å«åçåç¼ï¼å¦æä¸æ¯å«åï¼é£ä¹ä»»ä½æåç¼ç屿§å¼ç¨é½æ¯éæ³çã
No joins, either implicit or explicit, can be specified in a bulk HQL query. Sub-queries can be used in the where-clause, where the subqueries themselves may contain joins.
æ´ä¸ª WHERE å奿¯å¯éçã
举个ä¾åï¼ä½¿ç¨ Query.executeUpdate()
æ¹æ³æ§è¡ä¸ä¸ª HQL UPDATE
è¯å¥ï¼æ¹æ³å½åæ¯æ¥æºäº JDBC ç PreparedStatement.executeUpdate()
ï¼ï¼
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();
In keeping with the EJB3 specification, HQL UPDATE
statements, by default, do not effect the version or the timestamp property values for the affected entities. However, you can force Hibernate to reset the version
or timestamp
property values through the use of a versioned update
. This is achieved by adding the VERSIONED
keyword after the UPDATE
keyword.
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlVersionedUpdate = "update versioned Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();
注æï¼èªå®ä¹ççæ¬ç±»åï¼org.hibernate.usertype.UserVersionType
ï¼ä¸å
许å update versioned
è¯å¥èç¨ã
æ§è¡ä¸ä¸ª HQL DELETE
ï¼åæ ·ä½¿ç¨ Query.executeUpdate()
æ¹æ³ï¼
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = s.createQuery( hqlDelete )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();
ç± Query.executeUpdate()
æ¹æ³è¿åçæ´å
å¼è¡¨æäºåæ¤æä½å½±åçè®°å½æ°éãæ³¨æè¿ä¸ªæ°å¼å¯è½ä¸æ°æ®åºä¸è¢«ï¼æå䏿¡ SQL è¯å¥ï¼å½±åäºçâè¡âæ°æå
³ï¼ä¹å¯è½æ²¡æãä¸ä¸ªå¤§æ¹é HQL æä½å¯è½å¯¼è´å¤æ¡å®é
çSQLè¯å¥è¢«æ§è¡ï¼ä¸¾ä¸ªä¾åï¼å¯¹ joined-subclass æ å°æ¹å¼çç±»è¿è¡çæ¤ç±»æä½ãè¿ä¸ªè¿åå¼ä»£è¡¨äºå®é
被è¯å¥å½±åäºçè®°å½æ°éãå¨é£ä¸ª joined-subclass çä¾åä¸ï¼ 对ä¸ä¸ªåç±»çå é¤å®é
ä¸å¯è½ä¸ä»
ä»
ä¼å é¤åç±»æ å°å°ç表èä¸ä¼å½±åâæ ¹â表ï¼è¿æå¯è½å½±åä¸ä¹æç»§æ¿å
³ç³»ç joined-subclass æ å°æ¹å¼çåç±»ç表ã
INSERT
è¯å¥çä¼ªç æ¯ï¼INSERT INTO EntityName properties_list select_statement
ãè¦æ³¨æçæ¯ï¼
åªæ¯æ INSERT INTO ... SELECT ... å½¢å¼ï¼ä¸æ¯æ INSERT INTO ... VALUES ... å½¢å¼ã
properties_list å SQL INSERT
è¯å¥ä¸çåæ®µå®ä¹ï¼column speficiationï¼
类似ã对åä¸ç»§æ¿æ æ å°çå®ä½èè¨ï¼åªæç´æ¥å®ä¹å¨ç»å®ç类级å«ç屿§æè½ç´æ¥å¨ properties_list ä¸ä½¿ç¨ãè¶
ç±»ç屿§ä¸è¢«æ¯æï¼åç±»ç屿§æ æä¹ãæ¢å¥è¯è¯´ï¼INSERT
天ç䏿¯æå¤ææ§ã
select_statement å¯ä»¥æ¯ä»»ä½åæ³ç HQL éæ©æ¥è¯¢ï¼ä¸è¿è¦ä¿è¯è¿åç±»åå¿
é¡»åè¦æå
¥çç±»åå®å
¨å¹é
ãç®åï¼è¿ä¸æ£æ¥æ¯å¨æ¥è¯¢ç¼è¯çæ¶åè¿è¡çï¼è䏿¯æå®äº¤ç»æ°æ®åºã注æï¼å¨HibernateType
é´å¦æåªæ¯çä»·ï¼equivalentï¼èéç¸çï¼equalï¼ï¼ä¼å¯¼è´é®é¢ãå®ä¹ä¸º org.hibernate.type.DateType
å org.hibernate.type.TimestampType
çä¸¤ä¸ªå±æ§å¯è½ä¼äº§çç±»åä¸å¹é
é误ï¼è½ç¶æ°æ®åºçº§å¯è½ä¸å åºåæè
å¯ä»¥å¤çè¿ç§è½¬æ¢ã
对 id 屿§æ¥è¯´ï¼insert è¯å¥ç»ä½ ä¸¤ä¸ªéæ©ãä½ å¯ä»¥æç¡®å°å¨ properties_list è¡¨ä¸æå® id 屿§ï¼è¿æ ·å®ç弿¯ä»å¯¹åºç select 表达å¼ä¸è·å¾ï¼ï¼æè
å¨ properties_list ä¸çç¥å®ï¼æ¤æ¶ä½¿ç¨çææï¼ãåä¸ç§éæ©åªæå½ä½¿ç¨å¨æ°æ®åºä¸çæå¼ç id 产ç卿¶æè½ä½¿ç¨ï¼å¦ææ¯âå
åâä¸è®¡ç®çç±»åçæå¨ï¼å¨è§£ææ¶ä¼æåºä¸ä¸ªå¼å¸¸ã注æï¼ä¸ºäºè¯´æè¿ä¸é®é¢ï¼æ°æ®åºäº§çå¼ççæå¨æ¯ org.hibernate.id.SequenceGenerator
ï¼åå®çåç±»ï¼ï¼ä»¥åä»»ä½ org.hibernate.id.PostInsertIdentifierGenerator
æ¥å£çå®ç°ãè¿å¿æå¼å¾æ³¨æçæå¤æ¯ org.hibernate.id.TableHiLoGenerator
ï¼å®ä¸è½å¨æ¤ä½¿ç¨ï¼å ä¸ºå®æ²¡æå¾å°å
¶å¼çéå¾ã
对æ å°ä¸º version
æ timestamp
ç屿§æ¥è¯´ï¼insert è¯å¥ä¹ç»ä½ ä¸¤ä¸ªéæ©ï¼ä½ å¯ä»¥å¨ properties_list è¡¨ä¸æå®ï¼æ¤æ¶å
¶å¼ä»å¯¹åºç select 表达å¼ä¸è·å¾ï¼ï¼æè
å¨ properties_list ä¸çç¥å®ï¼æ¤æ¶ï¼ä½¿ç¨å¨ org.hibernate.type.VersionType
ä¸å®ä¹ç seed valueï¼ç§åå¼ï¼
ï¼ã
ä¸é¢æ¯ä¸ä¸ªæ§è¡ HQL INSERT
è¯å¥çä¾åï¼
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert )
.executeUpdate();
tx.commit();
session.close();
版权 © 2004 Red Hat, Inc.