Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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
Java Hibernate Envers如何正确获取日志历史记录?_Java_Spring Boot_Hibernate_Hibernate Envers_Spring Data Envers - Fatal编程技术网

Java Hibernate Envers如何正确获取日志历史记录?

Java Hibernate Envers如何正确获取日志历史记录?,java,spring-boot,hibernate,hibernate-envers,spring-data-envers,Java,Spring Boot,Hibernate,Hibernate Envers,Spring Data Envers,我使用Hibernate Envers创建了一个表审计日志,我使用Spring Data Envers作为我的库,当我保存/更新/删除它时,它成功地将日志保存在我的autid_日志表中,但是当我想要检索日志数据时,我得到了无限的错误循环,我如何正确地做到这一点?这是我的密码: 这是我的控制器: @GetMapping("/getPartnerRelationshipLog/{partnerId}") public ResponseEntity<?> getPart

我使用Hibernate Envers创建了一个表审计日志,我使用Spring Data Envers作为我的库,当我保存/更新/删除它时,它成功地将日志保存在我的autid_日志表中,但是当我想要检索日志数据时,我得到了无限的错误循环,我如何正确地做到这一点?这是我的密码:

这是我的控制器:

@GetMapping("/getPartnerRelationshipLog/{partnerId}")
public ResponseEntity<?> getPartnerRelationshipLog(@PathVariable Long partnerId) {
    // Long id = partner.getId();

    Revisions<Integer,Partner> history = partnerService.findRelationLog(partnerId);
    return ResponseEntity.ok(history);
 
}
这是我的服务:

public Revisions<Integer,Partner> findRelationLog(Long id) {
    Revisions<Integer,Partner> partner = partnerRepository.findRevisions(id);

    return partner;
}
当我得到id=1的数据时,我得到了类似于循环无限错误的东西,从java.lang.StackOverflowerError:null开始,我在终端中看到的只有以下内容:

java.lang.StackOverflowError: null
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]

为避免此错误,我错过了什么?

在两个实体上添加
@EqualsAndHashCode(of=“id”)
。我认为使用
@ToString
来指定所需字段也很好。我希望这能解决你的问题

@Data
@Entity
@Audited
@EntityListeners(AuditingEntityListener.class)
@Table(name = "msPartner")
@EqualsAndHashCode(of = "id")
@ToString(of = {"id", "partnerCode", "partnerName"})
public class Partner {}



@Data
@Entity
@Audited
@EntityListeners(AuditingEntityListener.class)
@Table(name = "msPartnerShipment")
@EqualsAndHashCode(of = "id")
@ToString(of = {"id", "partnerShipmentCode", "partnerShipmentAddress"})
public class PartnerShipment {}
@Data
注释实现了
@EqualsAndHashCode
。但在本例中,它创建了一个无限循环递归。示例:对于hashCode方法,
@EqualsAndHashCode
的默认实现将包括所有字段

public class Partner {
  public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final Object $id = this.getId();
    result = result * PRIME + ($id == null ? 43 : $id.hashCode());
    final Object $partnerCode = this.getPartnerCode();
    result = result * PRIME + ($partnerCode == null ? 43 : $partnerCode.hashCode());
    final Object $partnerName = this.getPartnerName();
    result = result * PRIME + ($partnerName == null ? 43 : $partnerName.hashCode());
    final Object $createDate = this.getCreateDate();
    result = result * PRIME + ($createDate == null ? 43 : $createDate.hashCode());
    final Object $lastModifiedDate = this.getLastModifiedDate();
    result = result * PRIME + ($lastModifiedDate == null ? 43 : $lastModifiedDate.hashCode());
    final Object $createdBy = this.getCreatedBy();
    result = result * PRIME + ($createdBy == null ? 43 : $createdBy.hashCode());
    final Object $modifiedBy = this.getModifiedBy();
    result = result * PRIME + ($modifiedBy == null ? 43 : $modifiedBy.hashCode());
    final Object $partnerShipment = this.getPartnerShipment();
    result = result * PRIME + ($partnerShipment == null ? 43 : $partnerShipment.hashCode());
    return result;
}
}
查看
Partnershipping
。它使用的是
result=result*PRIME+($partnerShipment==null?43:$partnerShipment.hashCode())
partnershipping
是这里的一个列表

列表的
hashCode
来自
AbstractList
,它是

    public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

在本例中,它迭代每个
PartnerShipment
项并调用其hashCode方法。您还在
PartnerShipment
上使用
@Data
注释,因此它的hashCode方法还包括
Partner
字段,该字段创建了一个无限递归。

woah,它解决了我的问题,为什么我需要添加@EqualsAndHashCode和@ToString?这是龙目山的注释,对吗?它不是已经包含在@Data中了吗?@KeVin我很高兴它帮助了你。我已经更新了答案。希望它能帮你清理干净concerns@KeVin您可以看到delombok的lombok注释生成的equals和hashCode方法。感谢您的详细解释,现在我了解了hashCode:)
java.lang.StackOverflowError: null
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
    at com.example.envers.auditing.Model.Partner.hashCode(Partner.java:31) ~[classes/:na]
    at com.example.envers.auditing.Model.PartnerShipment.hashCode(PartnerShipment.java:33) ~[classes/:na]
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_241]
    at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:131) ~[hibernate-envers-5.4.17.Final.jar:5.4.17.Final]
@Data
@Entity
@Audited
@EntityListeners(AuditingEntityListener.class)
@Table(name = "msPartner")
@EqualsAndHashCode(of = "id")
@ToString(of = {"id", "partnerCode", "partnerName"})
public class Partner {}



@Data
@Entity
@Audited
@EntityListeners(AuditingEntityListener.class)
@Table(name = "msPartnerShipment")
@EqualsAndHashCode(of = "id")
@ToString(of = {"id", "partnerShipmentCode", "partnerShipmentAddress"})
public class PartnerShipment {}
public class Partner {
  public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final Object $id = this.getId();
    result = result * PRIME + ($id == null ? 43 : $id.hashCode());
    final Object $partnerCode = this.getPartnerCode();
    result = result * PRIME + ($partnerCode == null ? 43 : $partnerCode.hashCode());
    final Object $partnerName = this.getPartnerName();
    result = result * PRIME + ($partnerName == null ? 43 : $partnerName.hashCode());
    final Object $createDate = this.getCreateDate();
    result = result * PRIME + ($createDate == null ? 43 : $createDate.hashCode());
    final Object $lastModifiedDate = this.getLastModifiedDate();
    result = result * PRIME + ($lastModifiedDate == null ? 43 : $lastModifiedDate.hashCode());
    final Object $createdBy = this.getCreatedBy();
    result = result * PRIME + ($createdBy == null ? 43 : $createdBy.hashCode());
    final Object $modifiedBy = this.getModifiedBy();
    result = result * PRIME + ($modifiedBy == null ? 43 : $modifiedBy.hashCode());
    final Object $partnerShipment = this.getPartnerShipment();
    result = result * PRIME + ($partnerShipment == null ? 43 : $partnerShipment.hashCode());
    return result;
}
}
    public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}