Can properties mapped in hbm.xml be transient?

Konrad Garus picture Konrad Garus · Dec 28, 2011 · Viewed 12.5k times · Source

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.

Answer

jayunit100 picture jayunit100 · Dec 28, 2011

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.