【问题标题】:JPA property java.net.URLJPA 属性 java.net.URL
【发布时间】:2011-01-22 06:03:54
【问题描述】:

你好,

我有一个对象,它有一段与之关联的 URL 信息。 目前我将此 URL 保存在一个简单的 String 属性中,但 java.net.URL 会 为我提供额外的好处,例如检测格式错误的 URL 等。

另一方面,如果 JPA 只是为 URL-Object 创建了一个 LOB,我会认为它非常难看。有谁知道 java.net.URL 类型的属性将如何持久保存到 符合 JPA 提供者的数据库?

【问题讨论】:

  • 我不认为 JPA 规范提供了这一点。您使用的是哪种实现方式?
  • 例如Hibernate 对此有 JPA 扩展
  • 例如 DataNucleus 对此(以及许多其他标准类型)有 JPA(和 JDO)扩展

标签: java jpa persistence


【解决方案1】:

您还可以使用 JPA AttributeConverter 例如解释 here 将 URL 对象映射到 String 列(Hibernate 开箱即用)

或者,如果您只对验证感兴趣,您可以使用 BeanValidation。 HibernateValidator 扩展中有一个@URL 注释,您也可以创建自己的约束,例如解释here

我个人更喜欢 BeanValidation 解决方案,因为将 url 视为 java.net.URL 会带来一些复杂性:需要 JPA AttributeConverter、JSF Converter、JAXB Adapter... 虽然它只是用于验证

【讨论】:

    【解决方案2】:

    根据 JPA 规范:

    持久性字段或属性 一个实体可能是以下类型: Java 原始类型; java.lang.String; 其他 Java 可序列化类型 (包括原语的包装器 类型,java.math.BigInteger, java.math.BigDecimal,java.util.Date, java.util.Calendar[7]、java.sql.Date、 java.sql.Time, java.sql.Timestamp, 用户定义的可序列化类型,byte[], 字节[]、字符[]和字符[]); 枚举;实体类型和/或 实体类型的集合;和 可嵌入的类(见部分 2.1.5)。

    加上对集合的支持。但没有对URL 的原始支持。但是,它们将被支持为Serializable,我猜这会导致您提到的 LOB。

    但是您应该能够轻松地绕过它:您可以将 URL 作为字段中的 String 和从 String 转换为 URL 的 getter/setter。然后使用注释映射该字段。

    或相反:字段中的java.lang.URL,以及从URL 转换为String 的getter/setter,然后将getter/setter 与注解映射。我认为它也有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2017-01-13
      • 2017-04-19
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多