我有以下关系:
@Entity
public class SomeEntity {
//...
@EmbeddedId
private SomeEntityIdentity id;
@OneToOne
@NotFound(action = NotFoundAction.EXCEPTION) //This is the important bit
@JoinColumns({
//...
})
private OtherEntity example;
//...
}
然后,我使用 Spring 数据的 findOne()
通过 Id 获取我的实体:
SomeEntityIdentity id = new SomeEntityIdentity();
id.setAttribute1(1);
id.setAttribute2(new BigDecimal(123));
return this.someEntityRepository.findOne(id);
问题在于,如果未找到 OtherEntity
,则不会抛出异常,因为 findOne()
只会返回 null。即使我设置了 @OneToOne(optional = false)
我仍然从 findOne()
得到一个 null,当我只排除 OtherEntity
是空。
我认为应该抛出异常。有没有人有任何想法?
谢谢!
编辑:下面的身份和存储库类。
@Embeddable
public class SomeEntityIdentity implements Serializable {
private int attribute1;
private BigDecimal attribute2;
public void setAttribute1(int attribute1) {
this.attribute1 = attribute1;
}
public void setAttribute2(BigDecimal attribute2) {
this.attribute2 = attribute2;
}
}
public interface SomeEntityRepository extends JpaRepository<SomeEntity, SomeEntityIdentity> {
}
最佳答案
原来是 Hibernate 和 Spring Data 版本不兼容。
该项目使用 Hibernate 4.3.1.Final
来利用 JPA 2.1
功能;但是对于 spring-data-jpa
1.6.6.RELEASE
,它不支持那个 Hibernate 版本。
因为一切正常(直到这个问题)我一开始没有注意到这一点。当我尝试将 spring-data-jpa
升级到 Hibernate 4.3
兼容版本时我做不到,因为 spring-data-jpa
从 Hibernate 跳转3 到 2.0.x
版本上的 Hibernate 5。这似乎也需要 Java 8,所以这对我来说是行不通的。
最终降级到 Hibernate 3.6.10.Final
并且一切正常。
TL;DR:始终检查 Spring 和其他库之间的版本兼容性,即使没有明显的错误。
最后我只想说 Spring 版本管理是一件很痛苦的事情。
工作依赖配置:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.10.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.10.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.6.6.RELEASE</version>
</dependency>
关于java - NotFoundAction.EXCEPTION 不抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51366659/