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数据版本之间不兼容

该项目使用Hibernate
4.3.1.Final
来利用JPA
2.1
特性;但是对于
spring数据jpa
1.6.6.RELEASE
,它不支持Hibernate版本

因为一切都正常工作(直到这个问题),我一开始没有注意到这一点。当我尝试将
spring数据jpa
升级到Hibernate
4.3
兼容版本时,我无法升级,因为
spring数据jpa
2.0.x
版本上从Hibernate 3跳到Hibernate 5。这似乎也需要Java8,所以这对我来说是不可能的

最终降级到Hibernate
3.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>