JPA属性java.net.URL

12

您好,

我有一个对象与URL信息相关联。目前我将这个URL保存在简单的字符串属性中,但是java.net.URL提供了额外的好处,例如检测格式错误的URL等。

另一方面,如果JPA只是为URL对象创建了LOB,则我认为它非常丑陋。是否有人知道符合JPA提供程序如何将java.net.URL类型的属性持久化到数据库中?


我认为JPA规范没有提供这个功能。你使用的是哪个实现? - skaffman
2
Hibernate具有JPA扩展功能。 - skaffman
DataNucleus为此(以及许多其他标准类型)提供了JPA(和JDO)扩展。 - DataNucleus
2个回答

11
根据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[]、Byte[]、char[]和Character[]);枚举;实体类型和/或实体类型的集合;以及可嵌入类(见2.1.5节)。
此外还支持集合。但没有对URL的原始支持。不过它们可以作为Serializable被支持,这可能会导致像你提到的LOB那样。
但是你应该能够轻松地绕过这个问题:你可以在一个字段中将URL作为String,并使用一个getter/setter将其从String转换为URL。然后使用注解映射该字段。
或者相反:用java.lang.URL保存在一个字段中,getter/setter将其从URL转换为String,然后使用注解映射getter/setter。我认为这也可以行得通。

3
您还可以使用JPA AttributeConverter,例如在此处here所解释的方式,将URL对象映射到String列中(Hibernate已经默认实现了该功能)。
或者,如果您只对验证感兴趣,则可以使用BeanValidation。在HibernateValidator扩展中有一个@URL注释,您也可以创建自己的约束,例如在此处here所解释的方式。
我个人更喜欢BeanValidation解决方案,因为将url视为java.net.URL会带来一些复杂性:需要JPA AttributeConverter,JSF Converter,JAXB Adapter等等...而这仅仅是为了进行验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接