Hibernate / Spring JPA,结合了@版本和@动态更新

5jdjgkvh  于 2023-02-21  发布在  Spring
关注(0)|答案(1)|浏览(139)

我有一个问题要问JPA / HibernateMaven:在我的应用程序中,我所有的实体都继承自一个“Base Intenty”,其中包含ID、cretedDate、Version以及应用程序所有实体共有的所有字段。

@MappedSuperclass
public class BaseEntity implements Serializable {

    /**
     * The constant serialVersionUID.
     */
    private static final long serialVersionUID = 1L;

    /**
     * The Id.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * The Created date.
     */
    @Basic(optional = false)
    @Column(columnDefinition = "TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP", name = "createddate")
    @CreatedDate
    @CreationTimestamp
    @JsonIgnore
    private ZonedDateTime createdDate;

    /**
     * The Updated date.
     */
    @Basic(optional = false)
    @Column(columnDefinition = "TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP", name = "updateddate")
    @UpdateTimestamp
    @LastModifiedDate
    @JsonIgnore
    private ZonedDateTime updatedDate;

    /**
     * The Version.
     */
    @Version
    @Column(columnDefinition = "INT DEFAULT 1")
    @JsonIgnore
    private Integer version;

    /**
     * The constant logger.
     */
    static Logger logger = LogManager.getLogger(BaseEntity.class.getName());

    /**
     * Instantiates a new Base entity.
     */
    public BaseEntity() {
    }
    [....]
}

但是碰巧其中一个实体(数据库的120个表中的一个)正在生成不必要的乐观锁异常,因为它是一个不应该需要@版本的表,所以我想添加:

@OptimisticLocking(type = OptimisticLockType.DIRTY)
@DynamicUpdate

这个特殊的实体。
我无法移除此类的BaseIntity继承,因为抽象JPA存储库需要扩展BaseEntity的类

@NoRepositoryBean interface CustomRepository<T extends BaseEntity, ID extends Serializable>
    extends Repository<T, ID>, Serializable {

因此,我的问题是:
如果一个实体既有通过其父实体定义的@Version列,又有本地激活的@DynamicUpdate,Hibernate / JPA的行为会是什么?
会发生什么?我检查了它编译和运行良好,但在将这个版本投入生产之前,我想知道它是否会有副作用...

jdgnovmf

jdgnovmf1#

您可以使用这种方法,但我建议您尝试摆脱这种限制模型,并将版本控制部分移到子类VersionedBaseEntity中。

相关问题