可以在hbm.xml中映射的属性是暂时的吗?

时间:2011-12-28 18:10:18

标签: java hibernate serialization transient

假设我有一个这样的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映射。

3 个答案:

答案 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应该没有问题。