遇到的问题
报错大概是长这样的, Unknown column 'xxx.fileId' in 'field list' ,因为这个 fileId 只是想作为一个临时变量用一下,并不想存入实体类对应的表中。这个属性在实体类中没有加 @Transient 注解,于是就报错了。
用法
我们来看看 @Transient 注解:
- @transient 就是需要给某个 javabean 添加一个属性,而这个属性我们又不希望它存到数据库中去,仅仅是做个临时变量用一下。不修改已经存在数据库中数据的数据结构。那么这时候就可以用这个注解了。
- @Transient 表示该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性。
- 如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient ,否则,ORM 框架默认其注解为 @Basic 。@Basic 用于声明属性的存取策略,表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的 getXxxx() 方法,默认即为@Basic。
java 的 transient 关键字的作用是需要实现 Serilizable 接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
原理:
我们知道一个对象只要实现了 Serilizable 接口,这个对象就可以被序列化。只要这个类实现了 Serilizable 接口,这个类的所有属性和方法都会自动序列化。
我们我们不想让一个实现了 Serilizable 接口的类里的某一个字段被序列化,就加上 transient 关键字修饰,被 transient 关键字修饰的变量不再能被序列化。
我们经常会有这样的需求,一个类的有些属性需要序列化,而其他属性不需要被序列化。也就是说,这个不需要被序列化的字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。此时就该 transient 登场了。
transient使用小结
1)一旦变量被 transient 修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient 关键字只能修饰变量,而不能修饰方法和类。本地变量是不能被 transient 关键字修饰的。变量如果是用户自定义类变量,则该类需要实现 Serializable 接口。
3)被 transient 关键字修饰的变量不再能被序列化,一个静态变量不管是否被 transient 修饰,均不能被序列化。