Is it possible to add functionality to the @Column annotation?

为君一笑 提交于 2021-01-28 07:57:37

问题


I'm wondering whether it is possible to add additional functionality to the @Column annotation in JPA. Specifically, what I would like to do is tag columns of sensitive data with an @ProtectedColumn annotation: this would then tell the persistence framework to apply some type of data protection (encryption, tokenization, whatever...) to the values when storing them into the actual data store, and then reverse that process when reading the values from the data store.

So I might have a Customer class that included this code:

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

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

Instead of storing the actual credit card number, this would then store the result of protecting the credit card number with the protection type "ultra" (whatever that may be).

Obviously, I don't want to re-implement all the database access functionality already present in the @Column annotation: I just want to extend its functionality. I know that annotations are not directly extensible (see Why is not possible to extend annotations in Java?), but it seems to me that it might be possible to intercept the value before it gets to the @Column annotation, so perhaps the field definition looks like this:

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

So my first question is whether this is even theoretically possible: if so, I'd appreciate any pointers on how to combine/extend annotations in this way.


回答1:


You can use a converter. For example you can implement a Converter like he did: use converter He uses xml configuration. If you want to use annotations, just have a look at these two java classes in this git repository:jpa converter with annotation Therefore you can use the annotation @Convert(converter = JPACryptoConverter.class) (Given that JPACryptoConverter is a child of AttributeConverter).




回答2:


Well short answer is No you can't simply extend the @Column annotation in Hibernate by adding a protection option to it but to provide a complete answer you can surely combine it with other annotations, to protect/encrypt a column in Hibernate you have two possible options:

  • Use Hibernate's @ColumnTransformer annotation to provide a customised column transformer for your column.
  • Use JPA Attribute Converter to provide a custom representation of your column.

Useful links:

For further reading about these two options you can check the following Thoughts On Java's tutorials:

  1. How to map encrypted database columns with Hibernate’s @ColumnTransformer annotation.
  2. How to implement a JPA Attribute Converter.

You can also check this answer to see how can you implement a custom Column Transformer.

A third option is to use Jasypth Integration library with Hibernate, you can read more about it in Integrating Jasypt with Hibernate 3.x or 4.x.



来源:https://stackoverflow.com/questions/43628222/is-it-possible-to-add-functionality-to-the-column-annotation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!