2010-09-10 2 views
1

Я делаю несколько testcases на проекте спящем:JPA 2 спящего режима установите блокировку на EntityManager.find

, когда я звоню

EntityManager em = getEntityManager(); 
em.find(Foo.class, 1) 

Я получаю юридическое лицо, как я ожидал, но когда я invoke:

EntityManager em = getEntityManager(); 
em.find(Foo.class, 1, LockModeType.WRITE) 

Я получаю null. Кроме того, когда я делаю:

EntityManager em = getEntityManager(); 
Foo foo = em.find(Foo.class, 1) 
em.lock(foo, LockModeType.WRITE); 

Я получаю объект, и он работает, как я ожидаю.

EDIT:

@javax.persistence.Entity 
@Table(name="foo") 
static class Foo implements Serializable { 
    @Id private Integer id; 
    private String code; 
    @Version private Integer version; 

    public Foo() { 
    } 
      ........   
} 

Мои зависимости:

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>3.5.5-Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>4.1.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>3.5.0-Beta-2</version> 
    </dependency> 
    <dependency> 
     <groupId>jboss</groupId> 
     <artifactId>jboss</artifactId> 
     <version>4.2.3.GA</version> 
     <scope>provided</scope> 
    </dependency> 

Можете ли вы дать мне точку?

ответ

2

Невозможно воспроизвести. Со следующим объектом:

@Entity 
public class Foo { 
    @Id private Integer id; 
    private String name; 
    @Version private Integer version; 
    ... 
} 

Следующий фрагмент кода просто работает:

EntityManager em = getEntityManager(); 
Foo foo = em.find(Foo.class, 1, LockModeType.WRITE); 
assertNotNull(foo); 
foo.setName("baz"); 
em.flush(); 

И читает и обновляет объект, используя оптимистическую блокировку, с обновлением версии:

 
10:21:42.223 [main] DEBUG org.hibernate.SQL - select foo0_.id as id25_0_, foo0_.name as name25_0_, foo0_.version as version25_0_ from Foo foo0_ where foo0_.id=? 
10:21:42.225 [main] TRACE org.hibernate.type.LongType - binding '1' to parameter: 1 
10:21:42.229 [main] TRACE org.hibernate.type.StringType - returning 'bar' as column: name25_0_ 
10:21:42.230 [main] TRACE org.hibernate.type.LongType - returning '0' as column: version25_0_ 
10:21:42.246 [main] DEBUG org.hibernate.SQL - update Foo set name=?, version=? where id=? and version=? 
10:21:42.248 [main] TRACE org.hibernate.type.StringType - binding 'baz' to parameter: 1 
10:21:42.249 [main] TRACE org.hibernate.type.LongType - binding '1' to parameter: 2 
10:21:42.249 [main] TRACE org.hibernate.type.LongType - binding '1' to parameter: 3 
10:21:42.250 [main] TRACE org.hibernate.type.LongType - binding '0' to parameter: 4 

Испытано с Hibernate 3.5 0,5-Финал.


Вы не с использованием той же версии (я упомянул об этом в явном виде из-за проблем, как HHH-5032). Попробуйте со следующими зависимостями вместо (вам не нужно указать зависимость от hibernate-core артефакта, вы получите его транзитивен):

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>4.1.0.Final</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>3.5.5-Final</version> 
</dependency> 
<dependency> 
    <groupId>jboss</groupId> 
    <artifactId>jboss</artifactId> 
    <version>4.2.3.GA</version> 
    <scope>provided</scope> 
</dependency> 
+0

Старается с той же версией, но все еще имея проблемы. – Hugo

+0

Отлично, кажется, сейчас работает .. но я нашел другое (отредактировав сообщение, маленький маленький здесь) – Hugo

+0

@Hugo Хорошо, рад, что он решен. Что касается новой проблемы, это еще один вопрос. Поэтому, пожалуйста, откройте новую (лучше всего не смешивать темы) и объясните, почему этот тест должен вызывать исключение, я не понимаю, почему это должно быть. –