Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hbm.xml中映射的属性是否可以是瞬态的?_Java_Hibernate_Serialization_Transient - Fatal编程技术网

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字段是否总是安全的,比如二级缓存等等。