当前位置: 首页 > 知识库问答 >
问题:

Javers-DiffIgnore在双向一域上

万俟渊
2023-03-14

我正在尝试将Javers与SpringDataREST项目集成。目前,我的域中有以下实体。

Student.class

@Entity
    public class Person  {

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

        private String firstName;

        private String lastName;

        private Long dob;

        @OneToOne
        private Gender gender;

        @OneToMany(cascade = CascadeType.ALL, mappedBy = "student", orphanRemoval = true)
        private List<ContactNumber> contactNumbers = new ArrayList<>();
    }

联系电话。班

    @Entity
    public class ContactNumber {

        @Id
        @GeneratedValue
        private Long id;

        private String phoneNumber;

        private Boolean isPrimary;

        @ManyToOne
        private Student student;

    }

在javers的文件中提到:

在现实世界中,域对象通常包含各种您不想审计的嘈杂属性,例如动态代理(如Hibernate懒惰加载代理)、重复数据、技术标志、自动生成数据等。

那么,这是否意味着我在contact number类中的@ManyToOne学生字段或学生类中的@OneToMany联系人字段中添加了@DiffIgnore

共有1个答案

洪飞白
2023-03-14

这取决于您如何记录对象以及您想要记录什么。考虑这两行(假设您在p和contactNumber之间有一个链接)

//This logs p and contactNumber as part of the array part of p. If you want to ignore contactNumber here,
//add @DiffIgnore on the @OneToMany property. If you want to ignore 
javers.commit("some_user", p);

//This would log contactNumber and p as the student. You can add @DiffIgnore here on the student property (@ManyToOne)
javers.commit("some_user", contactNumber);

请注意,还有另一个注释@ShallowReference,它将记录对象的id,而不是记录整个对象。例如,如果将@ShallowReference添加到student属性中,则不会记录整个Person对象,而只记录其ID。您可以使用该属性在这些对象之间建立链接。

更新:

查看您的模型,我建议您删除student属性。从电话号码上链接到学生是没有意义的。学生分配了一个号码,而不是相反。因此,您的模型将如下所示。

@Entity
public class Person  {

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

    private String firstName;

    private String lastName;

    private Long dob;

    @OneToOne
    private Gender gender;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "student", orphanRemoval = true)
    private List<ContactNumber> contactNumbers = new ArrayList<>();
}

联系电话。班

@Entity
public class ContactNumber {

    @Id
    @GeneratedValue
    private Long id;

    private String phoneNumber;

    private Boolean isPrimary;
}

如果您真的需要找到一个以电话号码开头的人/学生,您可以为您的人类创建一个存储库,使您能够进行搜索。看起来像这样:

//extend from the corresponding Spring Data repository interface based on what you're using. I'll use JPA for this example.
interface PersonRepository extends JpaRepository<Person, Long> {
    Person findByPhoneNumber(String phoneNumber);
}

这样,您的模型更干净,根本不需要使用DiffIgnore。

 类似资料:
  • 所以,我正在使用Hibernate 5和SpringMVC 4制作这个网络应用程序。出于某种原因,我无法插入具有OneTo很多关系的实体。在我首先解释任何事情之前,我想说我尝试了这里和其他论坛上发布的许多解决方案,但都不适合我...我不知道我在尝试解决问题时是否做错了什么。 现在,我最近添加了phone表。在此之前,我可以添加一个配置文件对象,它会级联同一事务中地址和用户实体的插入。现在,随着将电

  • 问题内容: 我在与JoinTables进行双向一对多关联时遇到了一些问题。这就是我得到的: A类: B类: 如果创建A和B的实例,请将B的实例添加到A并保存。有用。但是,当我重新加载A的实例并尝试访问B的集合时,它将引发LazyInitializationError并显示消息“对加载集合的非法访问”。 我在哪里错了?:)谁能指出我一个使用联接表的双向关联示例。在所有权保留为A类的地方,我搜索了hi

  • 本文向大家介绍JavaScript实现的双向跨域插件分享,包括了JavaScript实现的双向跨域插件分享的使用技巧和注意事项,需要的朋友参考一下 由于浏览器(同源策略)限制,JavaScript 跨域的问题,一直是一个颇为棘手的问题。HTML5 提供了跨文档消息传输的功能,在网页文档之间互相接收与发送信息。使用这个功能,不仅同源(域 + 端口号)的 Web 网页之间可以互相通信,还可以在两个不同

  • 问题内容: 我们的应用程序使用无限滚动来浏览大量异构项目列表。有一些皱纹: 对于我们的用户来说,通常有10,000个项目的列表,并且需要滚动3k +。 这些都是丰富的项目,因此在浏览器性能变得无法接受之前,我们只能在DOM中拥有几百个。 这些物品的高度各不相同。 这些项目可能包含图像,我们允许用户跳转到特定日期。这很棘手,因为用户可以跳到列表中需要在视口上方加载图像的位置,这会在加载时将内容下推。

  • JaversAuditController bean: 我必须使用BEAN映射样式,因为JPA注释位于实体的访问器上。 下面是JaversRepoConnectionProvider bean: 我在做人工审核。也就是说,每次保存实体时,我都会调用javers.commit()方法。碰巧的是,我尝试保存的第一件事就会导致一个MySQL语法错误,声明表“jv_commit”不存在。文档声明将自动创建

  • 问题内容: 更新 :在代码的另一部分中一定有些愚蠢。现在可以使用,因此bindToController语法很好。 我们正在使用AngularJS 1.4,它引入了在指令中使用bindToController的新方法。 经过大量的阅读(也许并不能理解所有内容),我们如下定义了指令: 从这样的另一个视图调用它: 先前已在视图控制器中定义: 像这样在指令模板中引用变量: 我们花了4小时试图弄清楚为什么我