Java NotFoundAction.EXCEPTION未引发异常
我有以下关系:Java NotFoundAction.EXCEPTION未引发异常,java,hibernate,jpa,spring-data-jpa,spring-data,Java,Hibernate,Jpa,Spring Data Jpa,Spring Data,我有以下关系: @Entity public class SomeEntity { //... @EmbeddedId private SomeEntityIdentity id; @OneToOne @NotFound(action = NotFoundAction.EXCEPTION) //This is the important bit @JoinColumns({ //... }) private Ot
@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()
中得到一个空值,当时我只将其他实体
设置为空值
我认为应该抛出一个异常。有人有什么想法吗
谢谢大家!
编辑:下面的标识和存储库类
@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;
}
}
公共接口SomeEntityRepository扩展了JpaRepository{
}
结果是Hibernate和Spring数据版本之间不兼容
该项目使用Hibernate4.3.1.Final
来利用JPA2.1
特性;但是对于spring数据jpa
1.6.6.RELEASE
,它不支持Hibernate版本
因为一切都正常工作(直到这个问题),我一开始没有注意到这一点。当我尝试将spring数据jpa
升级到Hibernate4.3
兼容版本时,我无法升级,因为spring数据jpa
在2.0.x
版本上从Hibernate 3跳到Hibernate 5。这似乎也需要Java8,所以这对我来说是不可能的
最终降级到Hibernate3.6.10。最终,一切正常
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>
org.hibernate
冬眠核心
3.6.10.最终版本
org.hibernate
休眠实体管理器
3.6.10.最终版本
org.springframework.data
spring数据jpa
1.6.6.1发布
Hmm,那么它工作正常吗?当findOne()
不返回SomeEntity
实例时,无论如何,@NotFound
注释永远不会被处理。我必须说,我从未使用过这个构造,但这就是我理解您的情况的方式。您确定具有给定标识符的实体存在吗?请发布SomeEntityIdentity
@EmbeddedId
表明id由多个属性组成,但在调用findOne
@Matt之前,您只在id
上设置了一个属性,SomeEntity
存在于数据库中,我从hibernate调试日志中获取了SQL,并确认返回了一条记录。数据库中不存在的实体是OtherEntity
@crizzis,关于标识,这只是一个示例,因为我无法公开实际的字段名。我更新了我的问题,以反映我的实际代码,只是更改了名称。我100%肯定SomeEntity
记录存在,hibernate正在进行左外部联接,如果我在SQL客户端中执行查询,查询将返回一个结果。当OtherEntity
存在时,提取SomeEntity
是否有效?这只是一个疯狂的尝试,但是BigDecimal
可能是这里的错误吗?是否可以将biginger
(或Long
)用于您的用例?我猜新的BigDecimal(123)
实际上并不等于db值,因为某些原因,我在hibernate“5.4.12.Final”上遇到了相同的错误。我试着像你一样降级到'3.6.10.Final',但是现在它总是抛出一个异常,不管我为@NotFound提供了什么值
<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>