jpa 2 hibernate установка блокировки на EntityManager.find - PullRequest
1 голос
/ 10 сентября 2010

Я делаю несколько тестовых случаев в спящем проекте:

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

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

Я получаю сущность, как я ожидаю, но когда я вызываю:

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

Я обнуляюсь.Кроме того, когда я делаю:

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

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

РЕДАКТИРОВАТЬ:

@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>

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

1 Ответ

2 голосов
/ 10 сентября 2010

Я не могу воспроизвести. Со следующим лицом:

@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.5-Final.


Вы не используете ту же версию (я упоминал об этом явно из-за таких проблем, как 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>
...