是否可以在@Column注释中添加功能?

时间:2017-04-26 07:59:40

标签: java jpa inheritance annotations

我想知道是否可以在JPA中为@Column注释添加其他功能。具体来说,我想做的是使用@ProtectedColumn注释标记敏感数据列:这将告诉持久性框架将某些类型的数据保护(加密,标记化,等等......)应用于值将它们存储到实际数据存储中时,然后在从数据存储中读取值时反转该过程。

所以我可能有一个包含此代码的Customer类:

@Column(value="Name")
private String name;

@ProtectedColumn(value="CreditCardNumber", protectionType="ultra")
private String creditCardNumber;

然后,这将存储保护信用卡号码的结果,而不是存储实际的信用卡号码,保护类型为" ultra" (不管是什么)。

显然,我不想重新实现@Column注释中已存在的所有数据库访问功能:我只是想扩展其功能。我知道注释不是可直接扩展的(参见Why is not possible to extend annotations in Java?),但在我看来,可能可以在它到达@Column注释之前拦截该值,所以字段定义可能如下所示:

@Protected(protectionType="ultra")
@Column(value="CreditCardNumber")
private String creditCardNumber;

所以我的第一个问题是这在理论上是否可行:如果是这样,我会理解如何以这种方式组合/扩展注释的任何指示。

2 个答案:

答案 0 :(得分:1)

您可以使用转换器。例如,您可以像他一样实现转换器: use converter 他使用xml配置。 如果你想使用注释,只需看看这个git存储库中的这两个java类:jpa converter with annotation 因此,您可以使用注释 @Convert(converter = JPACryptoConverter.class) (鉴于JPACryptoConverter是AttributeConverter的子代)。

答案 1 :(得分:0)

简短的回答是你不能通过在中添加保护选项来扩展Hibernate中的@Column注释来提供完全答案你肯定可以将它与其他注释结合起来,在Hibernate中保护/加密一个列你有两个可能的选择:

有用的链接:

有关这两个选项的进一步阅读,您可以查看以下Thoughts On Java教程:

  1. How to map encrypted database columns with Hibernate’s @ColumnTransformer annotation
  2. How to implement a JPA Attribute Converter
  3. 您还可以查看this answer,了解如何实施自定义列变换器。

    第三个选项是将 Jasypth 集成库与Hibernate一起使用,您可以在Integrating Jasypt with Hibernate 3.x or 4.x中阅读更多相关信息。