是否可以使用@Version替代配置? [英] Is there a configurable alternative to using @Version?

查看:126
本文介绍了是否可以使用@Version替代配置?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的所有JPA域类中都在其上放置了带注释的字段,其中带有@Version,但这似乎就像是额外的模板.有没有办法通过配置解决这个问题?

TIA, 奥莱(Ole)

解决方案

据JPA规范告诉我们,您不能通过配置"更改@Version批注.您可以在程序代码中使用@Version,也可以不使用.

请参考官方 JPA规范(最终版本,JPA 2.1)在第3.4.2节(第90页)中可以找到:

如果某个实体具有通过Version映射映射的属性或字段,则会自动启用乐观锁定.

[...]

如果仅某些实体包含版本属性,则需要持久性提供程序运行时来检查已为其指定了版本属性的那些实体.无法保证对象图一致性 ,但是某些实体上缺少版本属性不会阻止操作完成.

但是,您可以使用继承的概念通过抽象基类仅在一个位置提供@Version.该类的编写方式如下:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractBaseEntity { 

    public static final long INVALID_OBJECT_ID = -42;

    @Version
    private int version;    

    @Id
    @SequenceGenerator(name = "sequence-object", sequenceName = "ID_MASTER_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence-object")
    @Column(name = "id")
    protected Long objectID = INVALID_OBJECT_ID;

    public final int getVersion() {
        return version;
    }

    @Override
    public long getObjectID() {
        return objectID;
    }

    // ... maybe other methods or fields ...
}

因此,所有从AbstractPersistentEntity继承的带@Entity注释的子类都具有两个属性:(i)objectID和(ii)version.例如,类SomeClass可以写为:

@Entity
public class SomeClass extends AbstractBaseEntity /*implements SomeInterface*/ {
    // ... specific methods or fields ...
} 

有关使用@MappedSuperclass的详细信息,另请参见此答案.

希望有帮助.

I'm placing an annotated field with @Version on it in all my JPA domain classes, however this just seems like additional boiler plate. Is there a way to get around this perhaps via configuration?

TIA, Ole

解决方案

As far as the JPA specification tells us you can't change the @Version annotation via "configuration". You either use @Version in your program code or you don't.

Referring to the official JPA specification (final version, JPA 2.1) in Section 3.4.2 (page 90) we find:

An entity is automatically enabled for optimistic locking if it has a property or field mapped with a Version mapping.

[...]

If only some entities contain version attributes, the persistence provider runtime is required to check those entities for which version attributes have been specified. The consistency of the object graph is not guaranteed, but the absence of version attributes on some of the entities will not stop operations from completing.

However, you can use the concept of inheritance to provide the @Versiononly in one spot via an abstract base class. This class you be written as follows:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractBaseEntity { 

    public static final long INVALID_OBJECT_ID = -42;

    @Version
    private int version;    

    @Id
    @SequenceGenerator(name = "sequence-object", sequenceName = "ID_MASTER_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence-object")
    @Column(name = "id")
    protected Long objectID = INVALID_OBJECT_ID;

    public final int getVersion() {
        return version;
    }

    @Override
    public long getObjectID() {
        return objectID;
    }

    // ... maybe other methods or fields ...
}

Thus, all your @Entity annotated sub-classes that inherit from AbstractPersistentEntity are provided with both properties: (i) objectIDand (ii) version at once. For instance, class SomeClass can be written as:

@Entity
public class SomeClass extends AbstractBaseEntity /*implements SomeInterface*/ {
    // ... specific methods or fields ...
} 

For details on the use of @MappedSuperclass see also this answer.

Hope it helps.

这篇关于是否可以使用@Version替代配置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆