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

发布于 2024-12-23 11:07:43 字数 563 浏览 0 评论 0原文

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

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

我不想将 hashedPassword 传输给客户端,因此我将其设置为暂时的。

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

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

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

编辑:我已经得到了两个答案,但似乎没有包含方程式的某一特定方面。我根本没有使用注释,只使用 hbm.xml 中的 XML 映射。这个 Java 瞬态字段在 hbm.xml 中进行 OR 映射。

Suppose I have a User entity like this:

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

I don't want to ever transfer hashedPassword to clients, so I make it transient.

This class is mapped by Hibernate, with both fields mapped in hbm.xml.

Is this implementation safe and correct? Will Hibernate correctly store hashedPassword in database, load it into objects from database, keep it in replicated 2nd level cache and local session cache etc?

In order words, does Hibernate or 2nd level cache respect transient in any way or completely ignore it?

EDIT: I already got two answers that didn't seem to include one specific aspect of the equation. I am not using annotations at all, only XML mappings in hbm.xml. And this Java-transient field is OR-mapped in hbm.xml.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

弥繁 2024-12-30 11:07:43

休眠不保存未映射/瞬态属性

Hibernate 理解标准 java 瞬态修饰符的重要性 - 但也允许您使用 @Transient 注释将属性注释为瞬态,如果您选择的话......或者干脆将该字段从映射文件中删除。

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

所以:这里学到的教训 -

如果仅使用 hbm.xml

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

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

Unmapped/Transient properties are not saved by hibernate.

Hibernate understands the significance of standard java transient modifiers - but also allows you to annotate properties as transient using the @Transient annotation, if you so choose... Or just leave the field out of your mapping file altogether.

In your case, you probably will NOT need to do anything special, hibernate should simply "do the right thing", by ignoring unmapped fields.

So : the lesson learned here -

If only using hbm.xml

1) Unmapped properties are not saved by hibernate - they are effectively transient.

If using POJOs

2) Hibernate will ignore saving "@Transient" annotated variables :

@Transient
int ignored=0;

3) Hibernate will also ignore saving variables with standard "transient" modifiers :

private transient int ignored =0;

See http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ for an excellent explanation of this.

风渺 2024-12-30 11:07:43

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

单独的@Transient注释将允许您指示Hibernate忽略非瞬态字段以进行持久化,但我认为不可能做与让Hibernate持久化瞬态相反的事情。 /代码> 字段。

此处类似的讨论:

JPA - 在模型中使用注释

注释@Basic到瞬态变量

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

It looks like Hibernate will not persist a field with the transient keyword, regardless of what other annotations you have.

The separate @Transient annotation will allow you to direct Hibernate to ignore a non-transient field for persistence, but I don't think it's possible to do the opposite of having Hibernate persist a transient field.

Similar discussion here:

JPA - using annotations in a model

Annotation @Basic to transient variables

The most relevant quote via above, from JPA 2.0 spec: "Mapping annotations must not be applied to fields or properties that are transient or @Transient."

别把无礼当个性 2024-12-30 11:07:43

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

Here is what I think -
Hibernate is just a mapping technology. When you mark a field as TRANSIENT it will not be persisted by java. And since its state is not persisted why should hibernate maintain it in the L2 cache, etc ? so hibernate should have no problem even if you map the transient field in hbm file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文