Hibernate ORM - 实体属性支持 Java 1.8 Optional
Posted
技术标签:
【中文标题】Hibernate ORM - 实体属性支持 Java 1.8 Optional【英文标题】:Hibernate ORM - supporting Java 1.8 Optional for entity properties 【发布时间】:2014-07-26 21:45:41 【问题描述】:我正在尝试在某些 Persistent 类中使用 java.util.Optional
。有什么解决方法可以让它工作吗?
我曾尝试使用 UserType,但如果不手动将其映射到 SQL 类型,则无法处理 Optional 之类的内容(不可接受)
我也尝试使用 JPA Converter,但它不支持参数化类型。
我可以使用包装 getter 和 setter 之类的方法,但它更像是一种 hack,而不是一种解决方案
public class MyClass
private MyOtherClass other;
public Optional<MyOtherClass> getOther()
return Optional.ofNullable(other);
public voud setOther(Optional<MyOtherClass> other)
this.other = other.orElse(null);
谢谢!
【问题讨论】:
见Item 15: Do Not Use Optional in Setters Arguments 【参考方案1】:您不能将java.util.Optional
用作持久实体属性,因为Optional
不是Serializable
。
但是,假设您使用的是 field-based access,您可以在 getter/setter 方法中使用 Optional
容器。
然后Hibernate 可以从实体属性中获取实际类型,而getter 和setter 可以使用Optional
:
private String name;
public Optional<String> getName()
return Optional.ofNullable(name);
【讨论】:
我看到了这一点,我真的不得不说,你永远不应该只在属性中使用 Optional 作为方法的返回值。 我看到了这一点,我真的不得不说,只要您对它感到满意,即使每个人都在重复语言架构师,只要您想在代码库中避免null
,您就可以使用 optional谁不想在核心库中有“可选”的“monadic-ish”组合,以支持坚持使用 Hoars 10 亿美元的错误。只要确保防范带有无效对象的外部库/api”,你就会没事的。以上是关于Hibernate ORM - 实体属性支持 Java 1.8 Optional的主要内容,如果未能解决你的问题,请参考以下文章
hibernate 中的ORM是如何与数据库实现存储和查询的
2018.10.6 Hibernate配置文件详解-------ORM元数据配置 &&& hibernate主配置文件
如何在没有 AttributeConverter 或 customUserType 的情况下使用 Hibernate 5.2.10 MySQL JSON 支持映射到 Java 实体类?