下面列出了javax.persistence.EntityManager#lock ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Test(expected = OptimisticLockException.class)
public void givenVersionedEntitiesWithLockByLockMethod_whenConcurrentUpdate_thenOptimisticLockException() throws IOException {
EntityManager em = getEntityManagerWithOpenTransaction();
OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L);
em.lock(student, LockModeType.OPTIMISTIC);
EntityManager em2 = getEntityManagerWithOpenTransaction();
OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L);
em.lock(student, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
student2.setName("RICHARD");
em2.persist(student2);
em2.getTransaction()
.commit();
em2.close();
student.setName("JOHN");
em.persist(student);
em.getTransaction()
.commit();
em.close();
}
/**
* Finds the current invoice number, checks for uniqueness, retrieves it and increments by one
*
* @return
*/
private int findAndIncrementInvoiceNumber(){
int ret = 0;
EntityManager em = (EntityManager) ElexisEntityManagerServiceHolder.getEntityManager()
.getEntityManager(false);
try {
em.getTransaction().begin();
Config invoiceNr = em.find(Config.class, "RechnungsNr");
if (invoiceNr == null) {
Config invoiceNrConfig = new Config();
invoiceNrConfig.setParam("RechnungsNr");
invoiceNrConfig.setWert("1");
em.persist(invoiceNrConfig);
ret = 1;
} else {
em.lock(invoiceNr, LockModeType.PESSIMISTIC_WRITE);
ret = Integer.parseInt(invoiceNr.getWert());
ret += 1;
while (true) {
TypedQuery<Invoice> query =
em.createNamedQuery("Invoice.number", Invoice.class);
query.setParameter("number", Integer.toString(ret));
List<Invoice> results = query.getResultList();
if (results.isEmpty()) {
break;
} else {
ret += 1;
}
}
invoiceNr.setWert(Integer.toString(ret));
}
em.getTransaction().commit();
return ret;
} finally {
ElexisEntityManagerServiceHolder.getEntityManager().closeEntityManager(em);
}
}
/**
* Finds the current lab order number, checks for uniqueness, retrieves it and increments by one
*
* @return
*/
private int findAndIncrementLabOrderId(){
int ret = 0;
EntityManager em =
(EntityManager) ElexisEntityManagerServiceHolder.getEntityManager()
.getEntityManager(false);
try {
em.getTransaction().begin();
LabOrder version = em.find(LabOrder.class, "VERSION");
if (version == null) {
version = new LabOrder();
version.setId("VERSION");
version.setOrderid("1");
version.setDeleted(true);
em.persist(version);
ret = 1;
} else {
em.lock(version, LockModeType.PESSIMISTIC_WRITE);
ret = Integer.parseInt(version.getOrderid());
ret += 1;
while (true) {
TypedQuery<LabOrder> query =
em.createNamedQuery("LabOrder.orderid", LabOrder.class);
query.setParameter("orderid", Integer.toString(ret));
List<LabOrder> results = query.getResultList();
if (results.isEmpty()) {
break;
} else {
ret += 1;
}
}
version.setOrderid(Integer.toString(ret));
}
em.getTransaction().commit();
return ret;
} finally {
ElexisEntityManagerServiceHolder.getEntityManager().closeEntityManager(em);
}
}
/**
* Finds the current patient number, checks for uniqueness, retrieves it and
* increments by one
*
* @return
*/
private int findAndIncrementPatientNr(){
int ret = 0;
EntityManager em = (EntityManager) ElexisEntityManagerServiceHolder.getEntityManager()
.getEntityManager(false);
try {
em.getTransaction().begin();
Config patNr = em.find(Config.class, "PatientNummer");
if (patNr == null) {
Config patNrConfig = new Config();
patNrConfig.setParam("PatientNummer");
patNrConfig.setWert("1");
em.persist(patNrConfig);
ret = 1;
} else {
em.lock(patNr, LockModeType.PESSIMISTIC_WRITE);
ret = Integer.parseInt(patNr.getWert());
ret += 1;
while (true) {
TypedQuery<Kontakt> query =
em.createNamedQuery("Kontakt.code", Kontakt.class);
query.setParameter("code", Integer.toString(ret));
List<Kontakt> results = query.getResultList();
if (results.isEmpty()) {
break;
} else {
ret += 1;
}
}
patNr.setWert(Integer.toString(ret));
}
em.getTransaction().commit();
return ret;
} finally {
ElexisEntityManagerServiceHolder.getEntityManager().closeEntityManager(em);
}
}
@Override
protected void lockUpgrade(EntityManager entityManager, Post post) {
entityManager.lock(post, LockModeType.PESSIMISTIC_READ);
}