私はこれを解決しようと2日間長く苦労しており、私は何ができるのか分かりません。私のシステムは、エンティティに@Audit
を含む瞬間までかなりうまくいっていました。もちろん、.pomファイルにHibernate Enversを含めました。監査+ spring-boot-data-jpa + Hibernate + JPA 2トランザクション例外
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
</dependency>
私はすでに、これらの記事を試してみました:私がチェックし、すべて:(
で
Hibernare envers Audit with Spring data JPA and Spring Boot
Hibernate-envers throwing exception when Deleting entity with a collection using CrudRepository
しかし残念ながらいない成功を収めました私のmaven repository
と私は、hibernate 5.0.12.Final
バージョンのhibernate-core、hibernate-entitymanager、およびhibernate-enversを.pomファイルに設定したバージョンに関係なく使用していることに気付きました。ここで
は私の.pomファイルの依存関係である:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.1.3</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.6.1</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-core</artifactId>
<version>1.5.13</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.restdocs</groupId>
<artifactId>spring-restdocs-mockmvc</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
</dependencies>
ここでは
public class BRAuditEnversListener implements RevisionListener {
protected static final Logger log = Logger.getLogger("com.zerofila.web");
@Autowired
private UserService service;
@Override
public void newRevision(Object revisionEntity) {
BRAuditRevisionEntity customRevisionEntity = (BRAuditRevisionEntity) revisionEntity;
customRevisionEntity.setUsername(service.getAuthenticatedUser().getEmail());
}
}
Revinfoクラスリスナークラスです:insertメソッドを呼び出します
@Entity
@Table(name = "revinfo")
@RevisionEntity(BRAuditEnversListener.class)
public class BRAuditRevisionEntity implements Serializable {
private static final long serialVersionUID = 1L;
@RevisionNumber
private int id;
@RevisionTimestamp
private long timestamp;
private String username;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Transient
public Date getRevisionDate() {
return new Date(timestamp);
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof DefaultRevisionEntity)) {
return false;
}
DefaultRevisionEntity that = (DefaultRevisionEntity) o;
if (id != that.getId()) {
return false;
}
if (timestamp != that.getTimestamp()) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result;
result = id;
result = 31 * result + (int) (timestamp^(timestamp >>> 32));
return result;
}
@Override
public String toString() {
return "DefaultRevisionEntity(id = " + id + ", revisionDate = " + DateFormat.getDateTimeInstance().format(getRevisionDate()) + ")";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
Webサービス・エンドポイント:
@Override
@RequestMapping(value = "/create", method = RequestMethod.POST)
public ResponseEntity<Local> create(@ApiParam(value = "Local json stream resource", required = true) @Valid @RequestBody Local local) {
Local created = service.insert(local);
if (null == created)
return new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
return new ResponseEntity<Local>(created, HttpStatus.CREATED);
}
ここでは、例外をスローするメソッドです:
@Transactional
@Override
public Local insert(Local local) {
return repository.save(local);
}
そして最後に、例外(かなり短い、ところで):
2017-08-26 20:18:52.006 ERROR 2784 --- [nio-8080-exec-4] org.hibernate.AssertionFailure : HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): java.lang.NullPointerException
2017-08-26 20:18:52.009 WARN 2784 --- [nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
は、私は特別な何かを設定する必要がありますか?おそらくいくつかの注釈を追加するでしょうか?私が何をすることができるか考えていますか?
で作業している
'Local'トリガのインスタンスを保存する方法は明らかではありません監査イベント(この場合、前記例外につながる)。また、POMファイルは適切なSpring Bootプロジェクトにとっては複雑すぎます(たとえば、JPAおよびJPA APIの開始データが含まれている、Spring Bootスターターによって既にインポートされている理由など)。監査に関係のない依存関係を導入することなく、最初に株式Spring Bootプロジェクトで監査を実装するようにしてください(http://start.spring.ioで作成してください)。事がうまくいくと、徐々に他の部分を追加します。 – manish
@manishありがとう、私はこれらすべてをチェックします。好奇心をそそるのは(私が言ったように)「私のシステムは@Auditをエンティティに含めた瞬間まではかなりうまくいっていた」もちろん、休止状態のエンバーは依存関係として扱われます。結論私の.pomファイルでこれらのエントリを除外することをお勧めしますか?「 spring-boot-starter-data-jpa 」および「 hibernate-jpa-2.1-api ' ところで、質問に挿入物を呼び出す方法を追加しました。 ありがとう –
'spring-boot-starter'と' hibernate-envers'の依存関係を持つサンプルプロジェクトを作成し、監査要件をテストすることをお勧めします。 – manish