Friday, 15 January 2010

java - JPA @Version field doesn't get incremented -



java - JPA @Version field doesn't get incremented -

i'm new jpa , hibernate , have problem optimistic locking. have class wich hase @version annotated field. when update entity represented class, version counter not increase. here code: class:

@entity @table (name = "studenten") public class pupil implements serializable{ private static final long serialversionuid = 705252921575133272l; @version private int version; private int matrnr; private string name; private int semester; public pupil (){ } public pupil (int matrnr, string name){ this.matrnr = matrnr; this.name = name; } public pupil (int matrnr, string name, int semester){ this(matrnr, name); this.semester = semester; }

and here main method:

public static void main(string[] args) { entitymanagerfactory emf = persistence.createentitymanagerfactory("veda_vortrag"); entitymanager em = emf.createentitymanager(); entitytransaction tx = em.gettransaction(); try{ tx.begin(); pupil s = em.find(student.class, 195948); s.setsemester(1); em.persist(s); tx.commit(); }catch(exception e){ if(tx != null && tx.isactive()){ tx.rollback(); system.out.println("error in transaction. rollback!"); } } finally{ em.close(); emf.close(); } }

and here console says:

hibernate: select student0_.matrnr matrnr0_0_, student0_.name name0_0_, student0_.semester semester0_0_, student0_.version version0_0_ studenten student0_ student0_.matrnr=? hibernate: update studenten set name=?, semester=?, version=? matrnr=?

can tell me what's wrong?

edit: ok, have tried something. i've set locking lockmodetype.optimistic_force_increment , got error-message:

error: hhh000099: assertion failure occured (this may indicate bug in hibernate, more due unsafe utilize of session): org.hibernate.assertionfailure: cannot forcefulness version increment on non-versioned entity jun 20, 2014 9:00:52 org.hibernate.assertionfailure <init>

so seems clear have non-versioned entity. why? have @version annotation in class.

edit: begin think problem in persistence.xml. here is:

<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="veda_vortrag"> <provider>org.hibernate.ejb.hibernatepersistence</provider> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/uni"/> <property name="javax.persistence.jdbc.user" value="*******"/> <property name="javax.persistence.jdbc.password" value="******"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.driver"/> <property name="hibernate.dialect" value="org.hibernate.dialect.mysqldialect"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit>

is there wrong?

the entitymanager.persist() method used new entities have never been persisted before.

because fetching entity don't need phone call persist or merge anyway. dirty checking update on behalf.

the commit trigger flush anyway should see update.

make sure utilize javax.persistence.version annotation , not other bundle (spring info or similar).

java mysql hibernate jpa transactions

No comments:

Post a Comment