【问题标题】:Spring data revision repository: not returning onetomany when using getRevisionsSpring数据修订存储库:使用getRevisions时不返回onetomany
【发布时间】:2019-04-09 18:24:14
【问题描述】:

我有两个实体的“Application”和“ApplicationDocument”

表 1

@Entity
@Table(name = "applications")
@EntityListeners(AuditingEntityListener.class)
public class Application {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Audited
private String title;

@OneToMany(mappedBy = "application")
@JsonManagedReference
@AuditJoinTable
private List<ApplicationDocument> applicationDocuments;

}

表 2

@Entity
@Table(name = "applicationDocuments")
public class ApplicationDocument {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;

@ManyToOne()
@JoinColumn(name = "applicationid")
@JsonBackReference
@Audited
private Application application;

@Audited
private String file;

}

这将创建两个审计表,并且每次插入、更新和删除后都会修改数据。工作正常到这里

但是要检索修订版

我有一个扩展弹簧“RevisionRepository”的ApplicationRepository

所以当我获取类似 applicationRepository.getRevisions({{myApplicationId}}) 的内容时。然后,当我查看返回的修订实体时,一对多关系始终返回为 null。

我希望它返回一个包含该修订期间存在的任何 ApplicationDocuments 的列表。

任何想法我在这里错过了什么

【问题讨论】:

    标签: hibernate spring-boot hibernate-envers


    【解决方案1】:

    这里的问题在于Application 的映射。

    虽然 Envers 正在审核这两个实体,因为它们至少包含一个 @Audited 非 ID 属性,但 Application 中集合的反面并未被审核。简而言之,Envers 会忽略该属性,因为 @AuditJoinTable 本身不会触发该属性被包含在审计元数据中。

    您需要更改您的Application 实体,以便集合映射如下

    @OneToMany(mappedBy = "application")
    @Audited
    @AuditJoinTable
    private List<ApplicationDocument> applicationDocuments;
    

    要记住的一个捷径是,如果一个实体的所有属性都由 Envers 审计,您可以改为使用 @Audited 注释实际类,以尽量减少冗长,如果这有帮助,您也可以避免这个问题: )。

    【讨论】:

    • 非常感谢您的解释,是的,我可以在课堂上使用“已审核”,但我的真实实体还有很多其他我没有审核的属性。
    【解决方案2】:

    我现在正在尝试 spring-data-envers,我假设你的类路径中也有这个库。所以你得到了 EnversRevisionRepositoryImpl,它使用 Envers AuditReader API 来获取修订信息。无论 JPA 关系注释中指定了什么,此 API 返回的 Hibernate 代理中的关系都不会被初始化。因此,即使默认设置为渴望或渴望,也不会加载任何 OneToOne、OneToMany 等。

    有关于此问题的错误/功能请求,例如

    Eagerly load collections when indicated so in the annotation defining the relation

    Allow specifying join fetches through the AuditQuery API

    【讨论】:

    • 问题与急切/懒惰无关,但审计映射不正确,详情请参阅我的答案。
    • @Naros 映射不正确,这是真正的问题。只是为了让我正确,但返回的实体确实是代理并且 OneToMany 关系总是延迟加载? krishna 在调用 RevisionRepository 上的 findRevisions(ID) 后以某种方式检索 PersistenceContext 中的 ApplicationDocuments,对吗?仍然没有办法将它们与 Application 实体一起获取?
    • 那部分是准确的,当第一次通过 Envers 用来包装集合初始化的代理访问集合时,集合是延迟加载的。您提到的问题是我希望长期调查的对该过程的改进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2015-01-25
    • 2016-07-20
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多