2011-12-28 61 views
5

假设我有一个User实体是这样的:可以在hbm.xml中映射的属性是暂态的吗?

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

我不想永远传递hashedPassword给客户,所以我让短暂的。

该类由Hibernate映射,两个字段映射在hbm.xml中。

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

换句话说,Hibernate或二级缓存是否以任何方式尊重transient或完全忽略它?

编辑:我已经有两个答案,似乎并没有包括方程的一个特定方面。我根本没有使用注释,只有hbm.xml中的XML映射。并且此Java瞬态字段在hbm.xml中进行了或映射。

回答

3

看起来Hibernate不会在transient关键字中保留一个字段,不管其他注释是什么。

单独@Transient注释可以让你直接Hibernate来忽略持久性的非瞬时领域,但我不认为这是可能做到Hibernate来的相反坚持一个transient场。

类似的讨论在这里:

JPA - using annotations in a model

Annotation @Basic to transient variables

通过上面的最相关的报价,从JPA 2.0规范:“映射的注释不能被应用到字段或那些性质transient@Transient “。

+0

谢谢,但我特别提到该字段映射在hbm.xml中。我根本没有起诉注释。 – 2011-12-28 18:29:08

+0

在这种情况下,Hibernate是否实际映射属性?我假设annotations和hbm.xml表现相同,但可能情况并非如此。由于'transient'会确保属性没有被序列化,你的问题完全是关于Hibernate的行为吗? – wrschneider 2011-12-28 18:37:04

7

未映射/瞬态属性不会通过休眠保存。 Hibernate理解标准Java瞬态修饰符的重要性 - 但也允许您使用@Transient注释将属性注释为瞬态,如果您愿意选择...或者只是将字段完全保留在映射文件之外。在你的情况下,你可能不需要做任何特别的事情,冬眠应该简单地“做正确的事情”,通过忽略未映射的字段。

所以: - 如果只是使用的hbm.xml

)未映射属性不受休眠保存 - 的教训在这里他们有效地短暂。

如果使用的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/对此的一个很好的解释。

+0

谢谢,但我特别提到该字段映射在hbm.xml中。我根本没有起诉注释。 – 2011-12-28 18:29:31

+0

是的,这是真的 - POJO注释的东西是不相关的。我添加了一个项目符号来解决你的问题。在任何情况下 - 它的简单,只需将变量从地图中删除 - 休眠将看起来是另一种方式。不会进行保存或缓存,因为对象的hibernate的“映射”将不包含未映射的变量。 – jayunit100 2011-12-28 19:46:19

+0

谢谢杰伊,但我的观点完全相反。我问是否总是安全,第二个lv缓存和什么都不是,有一个临时POJO字段映射到hbm.xml。 – 2011-12-29 15:19:05

0

这是我的想法 - Hibernate只是一种映射技术。当你将一个字段标记为TRANSIENT时,它不会被java持久化。而且由于它的状态并没有持续下去,为什么hibernate应该把它保存在二级缓存中呢?所以即使映射hbm文件中的瞬态字段,hibernate也应该没有问题。

相关问题