【问题标题】:Does JPA 2.0 support user defined types?JPA 2.0 是否支持用户定义类型?
【发布时间】:2014-03-25 19:30:26
【问题描述】:

JPA 2.0 是否支持用户定义类型?我正在使用 OpenJPA。我查看了 2.0 规范,但没有看到有关用户定义类型的任何内容。我有点惊讶,我错过了什么吗?

通过用户定义的类型,我的意思是像 Hibernate 允许的那样。例如,您可以定义一个映射到 RED、GREEN 和 BLUE 列的客户颜色类型,然后在您的对象中保留一个颜色字段。这也可以通过 Embedded 对象来实现,但用户定义的类型可以用于其他事情。

我遇到的特殊问题是:

我有一个 LocationCode 类型(构成 Location 实体的一部分),它由 3 个数字字段组成。在我给出的数据库模式中,这被映射到 1 列,其中包含作为字符串附加在一起的 3 个字段。我想从应用程序中隐藏这个“映射”逻辑,以保持业务逻辑干净,并在更抽象的级别定义,而不是像这样处理存储逻辑。

我的第一次尝试是在我的对象上将 LocationCode 定义为 @Transient,并将另一个 String 字段映射到该列。在@PreUpdate @PrePersist 和@PreLoad 上,通过设置String 字段或将其解析为LocationCode 字段来执行3 个数值和1 个字符串之间的转换以及相反的转换。

问题在于 EntityManager.merge()。我无法将 Location 实体合并到数据库中,因为合并不会复制 @Transient LocationCode 字段。因此我必须自己处理 merge() 的这一部分,这会破坏级联合并的使用。

我认为,如果我为 LocationCode 使用自定义的用户定义类型,那么我可以拥有一个作为托管字段的 LocationCode,但仍然能够将 3 个数值映射到 1 个数据库列。然后 merge() 就可以了。

如果用户定义的类型不在 2.0 中,是否会在较新版本的 JPA 中添加它们?或者我可以在 OpenJPA 特定的 API 中找到它们?

感谢您的帮助。

【问题讨论】:

  • 你应该看看 JPA 2.1
  • 是的,我看到了。我被困在 OpenJPA 2.2.0 上,目前只能升级到 2.0。

标签: hibernate jpa merge openjpa transient


【解决方案1】:

不,JPA 2.0 没有,但 JPA 2.1 有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多