假设我有一个像这样的User实体:

class User {
    private String login;
    transient private String hashedPassword;
}

我不想将hashedPassword传输到客户端,因此我将其设置为 transient 。

此类是由Hibernate映射的,两个字段都映射在hbm.xml中。

此实现安全且正确吗? Hibernate是否会在数据库中正确存储hashedPassword,将其从数据库加载到对象中,将其保留在复制的第二级缓存和本地 session 缓存等中?

顺便说一句,Hibernate或2级缓存是否以某种方式尊重transient或完全忽略它?

编辑:我已经得到两个答案,似乎没有包含方程式的一个特定方面。我根本不使用批注,仅使用hbm.xml中的XML映射。并且此Java transient 字段在hbm.xml中进行OR映射。

最佳答案

未映射/ transient 属性不会由 hibernate 保存。

Hibernate理解标准Java transient 修饰符的重要性-但如果您选择的话,也可以使用@Transient批注将属性作为 transient 进行批注...或将字段完全排除在映射文件之外。

在您的情况下,您可能不需要做任何特殊的事情, hibernate 应该通过忽略未映射的字段来简单地“做正确的事”。

所以:在这里学到的教训-

(如果仅使用hbm.xml)

1)未映射的属性不会由 hibernate 保存-它们实际上是 transient 的。

如果使用POJO

2)Hibernate将忽略保存带“@Transient”注释的变量:

@Transient
int ignored=0;

3)Hibernate也将忽略使用标准“ transient ”修饰符保存的变量:
private transient int ignored =0;

有关此内容的出色解释,请参见http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

关于java - hbm.xml中映射的属性可以是 transient 的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8659594/

10-12 04:07