If we have a property that does not map to any column in the table, we simply do not specify that property in our hbm files. But with JPA annotations it is a little different. A class if marked with an Entity annotation, all its properties are considered persistent by default. So how do we exclude a property ?
One option is to mark the field transient.
One option is to mark the field transient.
@Entity @Table public class Pojo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column private String name; @Column private transient int number; //setter getters }If I were to run this code with the hbm2ddl.auto option set to create, it would totally ignore the number property. The SQL generated would be :
7219 [main] DEBUG org.hibernate.tool.hbm2ddl.SchemaExport - create table firstOne.Pojo ( id bigserial not null, name varchar(255), primary key (id) )The transient property would ensure that the column is ignored. Even the Column annotation that I left on the property did not see it included in the SQL.
The problem with the above approach is that it affects the serialization behaviour of the class - an unwanted side effect. If we were to use this class in any serializable environment then the number property will not be preserved.
JPA provides an alternative solution - the javax.persistence.Transientannotation.
@Transient private int number;With this in place we can ensure that this column is not visible to the JPA provider.
No comments:
Post a Comment