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

hibernate 中的ORM是如何与数据库实现存储和查询的

2018.10.6 Hibernate配置文件详解-------ORM元数据配置 &&& hibernate主配置文件

如何在没有 AttributeConverter 或 customUserType 的情况下使用 Hibernate 5.2.10 MySQL JSON 支持映射到 Java 实体类?

Hibernate

hibernate的相关问题