Ao executar o código que o instrutor passou:
public static void main(String[] args) {
@SuppressWarnings("resource")
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JpaConfigurator.class);
EntityManagerFactory factory = context.getBean(EntityManagerFactory.class);
EntityManager em1 = factory.createEntityManager();
EntityManager em2 = factory.createEntityManager();
em1.getTransaction().begin();
em2.getTransaction().begin();
Produto produtoDoEM1 = em1.find(Produto.class, 3);
em1.lock(produtoDoEM1, LockModeType.PESSIMISTIC_WRITE);
produtoDoEM1.setNome("Maria");
Produto produtoDoEM2 = em2.find(Produto.class, 3);
em2.lock(produtoDoEM2, LockModeType.PESSIMISTIC_WRITE);
}
Retornou este erro na linha do primeiro lock!!
Exception in thread "main" java.lang.IllegalArgumentException: entity not in the persistence context
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.lock(AbstractEntityManagerImpl.java:1472)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.lock(AbstractEntityManagerImpl.java:1461)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344)
at com.sun.proxy.$Proxy35.lock(Unknown Source)
at br.com.caelum.TesteLockPessimista.main(TesteLockPessimista.java:25)
Eu entendi o exemplo só quero entender o por que do erro?