我有以下关系:
@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()
,我仍然从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> {
}
答案 0 :(得分:1)
原来是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
在2.0.x
版本上从Hibernate 3跳到了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>