Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Is it possible to do batch updates using EclipseLink/JPA?

Thank you for reply. 

Cache will not help, because I always get detached objects that were loaded
using plain JDBC. However I can guarantee that these objects exist in
database so I don't want JPA to check for their existance. So in EclipseLink
I would use unitOfWork.registerExistingObject(person) which will return to
me a clone that I can modify and at the time of commit, it will know which
attributes were modifed. So my question is: can this functionality be
implemented using only JPA interfaces or am I forced to use EclipseLink? I
thought that perhaps @ExistenceChecking(value =
ExistenceType.ASSUME_EXISTENCE) will do the trick, but it doesn't seem to
work.

Initially I thought I would be able to accomplish this requirement by using
a named query:
"update person p set p.age = :age where p.id = :id". And it works for
executing individual updates, but I don't thinks it's possible to execute it
is as a batch update. It seems there is no addBatch() equivalent in Query
interface.

Any additional suggetions will be appreciated.





James Sutherland wrote:
> 
> You can use batch writing using the persistence.xml property,
> 
> "eclipselink.jdbc.batch-writing"="JDBC"
> 
> See,
> http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/config/PersistenceUnitProperties.html#BATCH_WRITING
> 
> The merge() API must read the object from the database if it does not
> exist in the cache.  If you do not want it to read from the database,
> ensure you have caching enabled (it is by default), or perhaps increase
> you cache size or type.  You must read an object before updating it, as
> otherwise you do not know what changed, or what related objects changed.
> 
> EclipseLink will always compute what fields changed, whether using weaving
> or not.  Weaving just allows the changes to be tracked through events,
> instead of through backup copies.
> 
> 
> 
> shkolnik wrote:
>> 
>> I have a very simple requirement: update a large number of records in DB. 
>> Using plain JDBC it would look like this: 
>> PreparedStatement stmt = connection.prepareStatement("update person set
>> age = ? where id = ?"); 
>> String age = getAge(); 
>> for(Person p : people) { 
>>      stmt.setString(1, age); 
>>      stmt.setLong(2, p.getId()); 
>>      stmt.addBatch(); 
>> } 
>> stmt.executeUpdate(); 
>> 
>> Using EclipseLink, I get the same effect like this: 
>> 
>> for(Person p : people) { 
>>      p = unitOfWork.registerExistingObject(p); 
>>      p.setAge(age); 
>> } 
>> unitOfWork.commit(); 
>> 
>> My question: is it possible to implement this using only JPA interfaces?
>> I tried using EntityManager.merge(), but it always executes a select
>> statement to check if record exists in db. I tried adding
>> @ExistenceChecking(value = ExistenceType.ASSUME_EXISTENCE) to the entity,
>> but it doesn't help. The second part of the question is even if its
>> possible to somehow force JPA not to check database, is it possible to
>> implement change tracking without any kind of weaving or will it update
>> all the fields? Maybe it's possible to specify which fields I want to be
>> updated? 
>> 
>> Thank you for your help.
>> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Is-it-possible-to-do-batch-updates-using-EclipseLink-JPA--tp22833966p22849064.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top