假设我有一个这样的User
实体:
class User {
private String login;
transient private String hashedPassword;
}
我不想将hashedPassword
转移到客户端,因此我将其设置为瞬态。
这个类由Hibernate映射,两个字段都映射在hbm.xml中。
此实施安全且正确吗? Hibernate会将hashedPassword
正确存储在数据库中,将其从数据库加载到对象中,将其保存在复制的二级缓存和本地会话缓存等中吗?
顺便说一句,Hibernate或二级缓存是以任何方式尊重transient
还是完全忽略它?
编辑:我已经得到了两个答案,似乎没有包含等式的一个特定方面。我根本没有使用注释,只使用hbm.xml
中的XML映射。此Java瞬态字段在hbm.xml
中进行OR映射。
答案 0 :(得分:7)
hibernate 不保存未映射/瞬态属性。
Hibernate理解标准java瞬态修饰符的重要性 - 但是如果您选择的话,还允许您使用@Transient注释将属性注释为瞬态...或者只是将字段完全从映射文件中删除。
在你的情况下,你可能不需要做任何特别的事情,hibernate应该只是“做正确的事”,忽略未映射的字段。
所以:这里学到的教训 -
如果仅使用hbm.xml
1)hibernate不会保存未映射的属性 - 它们实际上是瞬态的。
如果使用POJO
2)Hibernate将忽略保存“@Transient”注释变量:
@Transient
int ignored=0;
3)Hibernate也会忽略使用标准“瞬态”修饰符保存变量:
private transient int ignored =0;
请参阅http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/以获得对此的出色解释。
答案 1 :(得分:3)
看起来Hibernate不会使用transient
关键字保留字段,无论您拥有其他注释。
单独的@Transient
注释将允许您指示Hibernate忽略非瞬态字段以进行持久化,但我不认为可能与Hibernate持久存在transient
字段相反
此处类似的讨论:
JPA - using annotations in a model
Annotation @Basic to transient variables
以上最相关的引用,来自JPA 2.0规范:“映射注释不得应用于transient
或@Transient
的字段或属性。”
答案 2 :(得分:0)
这是我的想法 - Hibernate只是一种映射技术。当您将字段标记为TRANSIENT时,它将不会被java持久化。并且由于它的状态没有持久化,为什么hibernate应该在L2缓存中维护它等等?所以即使你在hbm文件中映射瞬态字段,hibernate应该没有问题。