Java hbm.xml中映射的属性是否可以是瞬态的?
假设我有一个Java hbm.xml中映射的属性是否可以是瞬态的?,java,hibernate,serialization,transient,Java,Hibernate,Serialization,Transient,假设我有一个用户实体,如下所示: class User { private String login; transient private String hashedPassword; } 我不想将hashedPassword传输到客户端,所以我将其设置为瞬态 此类由Hibernate映射,两个字段都映射在hbm.xml中 此实现是否安全且正确?Hibernate是否将hashedPassword正确存储在数据库中,将其从数据库加载到对象中,并将其保存在复制的二级缓存和本地会话
用户
实体,如下所示:
class User {
private String login;
transient private String hashedPassword;
}
我不想将hashedPassword
传输到客户端,所以我将其设置为瞬态
此类由Hibernate映射,两个字段都映射在hbm.xml中
此实现是否安全且正确?Hibernate是否将hashedPassword
正确存储在数据库中,将其从数据库加载到对象中,并将其保存在复制的二级缓存和本地会话缓存等中
换句话说,Hibernate或二级缓存是否以任何方式尊重瞬态,或者完全忽略它
编辑:我已经得到了两个答案,似乎没有包括等式的一个具体方面。我根本不使用注释,只在
hbm.XML
中使用XML映射。这个Java瞬态字段在hbm.xml
中进行了映射,看起来Hibernate不会持久化带有transient
关键字的字段,不管您有什么其他注释
单独的@Transient
注释将允许您指示Hibernate忽略一个非Transient字段以进行持久化,但我认为这不可能与让Hibernate持久化一个Transient
字段相反
类似的讨论如下:
上面JPA 2.0规范中最相关的引用是:“映射注释不得应用于
瞬态
或@transient
”hibernate不保存未映射/瞬态属性
Hibernate理解标准java瞬态修饰符的重要性,但也允许您使用@transient注释将属性注释为瞬态,如果您选择的话。。。或者干脆将该字段完全从映射文件中删除
在您的情况下,您可能不需要做任何特殊的事情,hibernate应该简单地“做正确的事情”,忽略未映射的字段
那么:这里的教训是什么-
如果只使用hbm.xml
1) hibernate不会保存未映射的属性-它们实际上是暂时的
如果使用POJO
2) Hibernate将忽略保存“@Transient”注释变量:
@Transient
int ignored=0;
3) Hibernate还将忽略使用标准“瞬态”修饰符保存变量:
private transient int ignored =0;
请参阅,以获得对此的极好解释 以下是我的想法-
Hibernate只是一种映射技术。当您将一个字段标记为TRANSIENT时,它将不会被java持久化。既然它的状态没有持久化,为什么hibernate要在二级缓存中维护它,等等?因此,即使在hbm文件中映射瞬态字段,hibernate也应该没有问题 谢谢,但我特别提到该字段映射到hbm.xml中。我根本没有起诉注释。在这种情况下,Hibernate真的映射了属性吗?我假设注释和hbm.xml的行为是相同的,但事实可能并非如此。由于
transient
将确保属性不会序列化,因此您的问题完全是关于Hibernate行为的吗?谢谢,但我特别提到了该字段在hbm.xml中映射。我根本没有起诉注解。是的,那是真的——POJO注解的东西是不相关的。我加了一颗子弹来回答你的问题。在任何情况下——这很简单,只需将变量从映射中删除即可——hibernate将以另一种方式显示。不会进行保存或缓存,因为hibernate的对象“映射”不会包含unmap变量。谢谢jay,但我的观点正好相反。我想问的是,使用hbm.xml映射一个临时POJO字段是否总是安全的,比如二级缓存等等。