2011-03-11 61 views
0

我正在尝试openjpa和jpa。我只有一个实体类作为数据库中的对应表。实体的其中一个属性是用户名,db表中的相应行具有varchar2(20)。在我的主要方法是什么,我试图实体与用户名长度超过20 坚持和实例所有我做的是openjpa抛出optimisticklockexception

em.getTransaction().begin(); 
em.persist(entity); //entity here is the instance with the username longer than 20 
em.getTransaction().commit(); 

我想这一点,希望能得到一些其他类型的异常,但我不我为什么会遇到乐观抑制的想法?

我没有任何锁定设置。我的意思是我使用默认值来锁定属性。

有人知道这里发生了什么吗?

+0

你怎么样发布entir

private Long version; @Version @Column(name="VERSION") public Long getVersion() { return version; } public void setVersion(Long version) { this.version = version; } 

希望这有助于... e堆栈跟踪和你的实体?什么版本的OpenJPA?你如何增强你的实体? – Rick 2011-03-13 18:02:50

回答

0

不知道为什么会这样......我已经注意到,OptimisticLockException在怪异的情况下,抛出...

添加一个版本字段到表和实体往往能OpenJPA的带有锁定更好地工作.. 。

在实体bean添加这个(也添加一个名为版本到你表中的列):

+0

不,它没有工作。我试过了,如果我使用正确的数据,它可以很好地工作。假设,如果坚持一个新的实例它运作良好,版本设置为1.接下来,如果检索行并进行一些更改,再次运行良好,版本会自动递增到2. – BeeRung 2011-03-12 05:36:54

+0

对不起,点击输入错误。而且,当试图持续并使用无效数据实例(例如字段值为String的字符串超过20)时,它又会抛出相同的OptimisticLockException。我在想,一个更合适的例外会对我有帮助。 – BeeRung 2011-03-12 05:40:42