javax.persistence.EntityManager#lock ( )源码实例Demo

下面列出了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();
}
 
源代码2 项目: elexis-3-core   文件: InvoiceEntityListener.java
/**
 * 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);
	}
}
 
源代码3 项目: elexis-3-core   文件: LabOrderEntityListener.java
/**
 * 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);
	}
}
 
源代码4 项目: elexis-3-core   文件: KontaktEntityListener.java
/**
 * 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);
}