6

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

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

我不想转移hashedPassword给客户,所以我让它暂时。

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

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

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

编辑:我已经得到了两个答案,似乎没有包含等式的一个特定方面。我根本不使用注释,只使用 .xml 中的 XML 映射hbm.xml。并且这个 Java-transient 字段是 OR-mapped in hbm.xml

4

3 回答 3

8

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/以获得很好的解释。

于 2011-12-28T18:19:51.010 回答
3

看起来 Hibernate 不会保留带有transient关键字的字段,无论您有什么其他注释。

单独的@Transient注释将允许您指示 Hibernate 忽略非瞬态字段以进行持久性,但我认为与让 Hibernate 持久性transient字段相反是不可能的。

类似的讨论在这里:

JPA - 在模型中使用注释

注释 @Basic 到瞬态变量

上面最相关的引述来自 JPA 2.0 规范:“映射注释不得应用于为 or 的字段或属性transient@Transient

于 2011-12-28T18:19:01.603 回答
0

这就是我的想法——Hibernate 只是一种映射技术。当您将字段标记为 TRANSIENT 时,java 不会将其持久化。既然它的状态不是持久化的,为什么休眠应该在二级缓存等中维护它?因此,即使您在 hbm 文件中映射瞬态字段,休眠也应该没有问题。

于 2011-12-28T19:11:15.357 回答