Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 映射到具有JPA注释的实体的旧版本_Hibernate_Jpa_Hibernate Envers - Fatal编程技术网

Hibernate 映射到具有JPA注释的实体的旧版本

Hibernate 映射到具有JPA注释的实体的旧版本,hibernate,jpa,hibernate-envers,Hibernate,Jpa,Hibernate Envers,我最近发现了enversforauditing,并成功地使用它跟踪修订,并使用@Audited注释和AuditReader获取修订。现在,我试图实现的是在进行修订时保留到审计实体的映射,而不是最新修订 快速示例: 假设我有一个cookie的配方,我用它来批量制作cookie(下面的类是伪类)。每个配方都有一个要遵循的说明列表,这样做会创建一个批次: @Audited @Table(name="recipes") class CookieRecipe { @OneToMany(mapped

我最近发现了enversforauditing,并成功地使用它跟踪修订,并使用
@Audited
注释和
AuditReader
获取修订。现在,我试图实现的是在进行修订时保留到审计实体的映射,而不是最新修订

快速示例:

假设我有一个cookie的配方,我用它来批量制作cookie(下面的类是伪类)。每个配方都有一个要遵循的说明列表,这样做会创建一个批次:

@Audited
@Table(name="recipes")
class CookieRecipe {
    @OneToMany(mappedBy="recipe")
    private List<RecipeStep> steps;

    private void addStep(String instruction) {
        steps.add(new RecipeStep(instruction));
    }
}

@Table(name="batches")
class CookieBatch {
    @ManyToOne
    @JoinColumn(...)
    private CookieRecipe recipe;
}

@Audited
@Table(name="recipe_step")
class RecipeStep {

    @Column
    private String instruction;

    @ManyToOne
    @JoinColumn(...)
    private CookieRecipe recipe;

    private RecipeStep(String instruction) {
        this.instruction = instruction;
    }
}
我将用这个食谱来制作我的第一批饼干:

CookieBatch batch = new CookieBatch(recipe);
entityManager.persist(batch);
例如,如果我想将配方改为375F而不是400F,这将创建
CookieRecipe
的第2版,这正是我所期望和想要的。但是,我希望我已经创建的批处理指向
CookieRecipe
的修订版1。目前,如果我获取我已经使用ID创建的
CookieBatch
,则对
CookieRecipe
的引用将成为最新版本(带有375F的版本)


这是我使用envers可以完成的吗?

我建议对
CookieBatch
进行审核,并在
CookieBatch
CookieCipe
之间保持双向关系。通过这种方式,Envers可以从任意一方正确地查询适当的版本

换句话说,将以下内容添加到
CookieRecipe

@OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL)
private List<CookieRecipeBatch> batches = new ArrayList<>();
@OneToMany(mappedBy=“recipe”,cascade=CascadeType.ALL)
私有列表批次=新的ArrayList();
然后,可以使用以下循环获取相应的版本数据:

AuditReader reader = AuditReaderFactory.get( session );
for ( Number revision : reader.getRevisions(CookieRecipe.class, recipeId ) ) {
  CookieRecipe recipe = reader.find( CookieRecipe.class, recipeId, revision );
  // recipe.getSteps() - contains all steps with revision number <= revision
  // recipe.getBatches() - contains all batches with revision number <= revision
}
AuditReader=AuditReaderFactory.get(会话);
for(编号修订:reader.getRevisions(CookieRecipe.class,recipeId)){
CookieRecipe recipe=reader.find(CookieRecipe.class,recipeId,revision);

//recipe.getSteps()-包含修订号为的所有步骤。我建议审核
CookieBatch
,并在
CookieBatch
CookieCiepe
之间保持双向关系。这样,Envers可以从任何一方正确查询相应的版本

换句话说,将以下内容添加到
CookieRecipe

@OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL)
private List<CookieRecipeBatch> batches = new ArrayList<>();
@OneToMany(mappedBy=“recipe”,cascade=CascadeType.ALL)
私有列表批次=新的ArrayList();
然后,可以使用以下循环获取相应的版本数据:

AuditReader reader = AuditReaderFactory.get( session );
for ( Number revision : reader.getRevisions(CookieRecipe.class, recipeId ) ) {
  CookieRecipe recipe = reader.find( CookieRecipe.class, recipeId, revision );
  // recipe.getSteps() - contains all steps with revision number <= revision
  // recipe.getBatches() - contains all batches with revision number <= revision
}
AuditReader=AuditReaderFactory.get(会话);
for(编号修订:reader.getRevisions(CookieRecipe.class,recipeId)){
CookieRecipe recipe=reader.find(CookieRecipe.class,recipeId,revision);

//recipe.getSteps()-包含所有修订号为的步骤,我相信您唯一的方法是在
CookieBatch
中保留
recipeId
RecipeVisionNumber
字段,并自己加载
CookieRecipe
对象

@Table(name="batches")
class CookieBatch {

    @Column(...)
    Long recipeId;

    @Column(...)
    Long recipeRevisionNumber;

    @Transient
    private CookieRecipe recipe;

    @PostLoad
    public void loadRecipe()
    {
        // Load a cookie recipe via audit criteria
    }
}
审计标准是不言自明的,请查看以下示例:

和所有东西的文档envers:


我相信您唯一的方法是在
CookieBatch
中保留
recipeId
RecipeVisionNumber
字段,并自己加载
CookieRecipe
对象

@Table(name="batches")
class CookieBatch {

    @Column(...)
    Long recipeId;

    @Column(...)
    Long recipeRevisionNumber;

    @Transient
    private CookieRecipe recipe;

    @PostLoad
    public void loadRecipe()
    {
        // Load a cookie recipe via audit criteria
    }
}
审计标准是不言自明的,请查看以下示例:

和所有东西的文档envers:


CookieBatch
没有被审计是故意的吗?如果是这样,我不相信有一种优雅的方式来做你想做的事情。@SergeiBednar是的,唯一的原因是一旦
CookieBatch
完成了,它就不会改变。所以我认为这是不必要的,因为它只会创建一个审计表,这样就可以了永远不要真正被使用…除非我误解了这种行为。我不反对将
@Audited
添加到它中,如果它导致了解决方案。我认为这里唯一的解决方案是保留
recipeId
RecipeVisionNumber
值,将
CookieBatch
中的
配方
实体更改为
@Tr加载
CookieBatch
实体后,ansient
,并通过envers
AuditCriteria
,自行处理配方查询。@SergeiBednar我认为这将是适合我的解决方案,介意将其作为解决方案发布吗?此外,您是否了解如何在p保存
CookieBatch
CookieBatch
应该保存到这一点,您可以通过审核标准获得最新版本。查看此文档,它非常可靠:
CookieBatch
未被
@Audited
是故意的?如果是这样,我不相信有一种优雅的方式来完成您的任务“我们正试图这么做。@SergeiBednar是的,唯一的原因是一旦
CookieBatch
完成,它就不会改变。所以我认为这是不必要的,因为它只会创建一个永远不会被真正使用的审核表……除非我误解了这种行为。如果能够找到解决方案,我不反对向它添加
@Audited
。我认为您唯一的其他解决方案是保留
recipeId
recipeRevisionNumber
值,将
CookieBatch
中的
配方
实体更改为
@Transient
,并在加载
CookieBatch后,通过envers
审核标准
自行处理配方查询e> 实体。@SergeiBednar我认为这将是适合我的解决方案,介意将其作为解决方案发布吗?此外,您是否了解如何在保存
CookieBatch
时获取
recipeRevisionNumber
?此时应保存
CookieRecipe
,您可以通过审计准则