精华内容
下载资源
问答
  • @transient 注解注解,什么意思

    万次阅读 2016-11-25 09:52:21
    实体类中使用了@Table注解后,想要添加表中不存在字段,就要使用@Transient这个注解了。在网上找的方法是要将这个注解添加到自定义字段的get方法上,这样做了之后程序报错,最后试了将该注解添加到定义该字段的头部...

    该注解,是Hibernate、morphia等框架的注解。 

    1)Hibernate中:

    实体类中使用了@Table注解后,想要添加表中不存在字段,就要使用@Transient这个注解了。在网上找的方法是要将这个注解添加到自定义字段的get方法上,这样做了之后程序报错,最后试了将该注解添加到定义该字段的头部即可,例如:

    即放在实体类的成员变量上部。

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. @Transient  
    2. private String str;


    2)morphia中:

    根据我之前的文章知道,mongodb数据库是没有数据库字段的。但就不存在”想要添加表中不存在字段,就要使用@Transient这个注解了“的问题,那为什么还是用@Transient?

    答:

    因为使用morphia框架,一般情况下,保存原始和基本类型的属性到Mongo中,你不必为他们添加任何注解。但是如果你不想该实体类中的某个字段(如

    //这个是常量。引入这个常量,是为了:1)直接调用即可,不用每次都输入“telNum”。2)便于代码的可读性,如果你在程序中输入“telNum”别人不明白是什么,你固定写到某个位置,大家一看就明白了 3)也可以防止别写程序时将“telNum”敲错,因为使用"对象名.成员变量名"输入“.”的时候会有可能代码提示,选择即可,这样是不可能出错的。
    public final static String telNum= "telNum";
    //类似于jf工程中,如下的用法
    //public class ProjectContants {
    	//public static String CURRENT_USER = "CURRENT_USER";
    	//public static String CURRENT_ORGAN = "CURRENT_ORGAN";
    	//public static String CURRENT_PROJECT = "CURRENT_PROJECT";
    	//public static String RANDOM_IMAGE_CODE="RANDOM_IMAGE_CODE";
    //}
    )作为document存入mongodb数据库中,那么你就要加上@Transient。不然,当你执行mongodb的findAndModify等新增、修改操作时,你不想写入mongodb的某个字段,也写入mongodb数据库中了。
    http://blog.csdn.net/z69183787/article/details/52942124

    因为使用morphia框架,一般情况下,保存原始和基本类型的属性到Mongo中,你不必为他们添加任何注解:
    [java] view plain copy
     
     
    1. private int myInt;  
    2. private Date myDate;  
    3. private List<String> myStrings;  
    4. private String[] stringArray;  

    默认情况下,Morphia将会试着映射所有支持的基本和原始类型到Mongo,包括这些类型的数组。

    MongoDB仅仅有以下数据类型:

    •Integer(32位有符号值)

    •Long(64有符号值) 

    •Double(64位IEEE745浮点值)

    •String (字符串)

    这里有些有价值的转换

    •float  →  double

    •byte   →  int

    •short  →  int

    •char  →  String       

    并且,依赖于你的模型中存在的类型和数据库将会试着自动为你转换。我的意思是,因为在MongoDB数据库中只存在三种数字类型(32/64有符号, 64位FP)这将相当容易转换。下面的列表为当前什么样的基本和原始类型可以被保存:

     •enum(在Mongo中作为String保存)

    Java.util.Date(在Mongo中保存为从新纪元UTC的毫秒数)

    •java.util.Locale(作为字符串保存)

    •com.mongodb.DBRef

    •com.mongodb.ObjectId                  

     正如我我们上面的例子所示,Morphia还支持java.util.List,java.util.Set和java.util.Map容器,和任何支持的原始类型的数组。如果你想把一个属性排除映射到Mongo中, 你可以使用@Transient注解:

    [java] view plain copy
     
     
    1. import com.google.code.morphia.annotations.Transient;  
    2.   
    3. @Transient  
    4. private int myTransientInt;  
    默认情况下,Morphia把属性名作为Mongo中的字段名。这个可以通过@Property注解进行修改,指定一个名称。

    [java] view plain copy
     
     
    1. import com.google.code.morphia.annotations.Property;   
    2.   
    3. @Property("my_integer")   
    4. private int myInt;  //在MongoDB中为my_integer     






    展开全文
  • 先给出这篇文章的大致脉络首先,介绍了transient的基本概念和基本用法然后,介绍深入分析一下transient关键字,并介绍几个需要掌握的问题最后,来个总结一、初识transient关键字其实这个关键字的作用很好理解,就是...

    这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。

    先给出这篇文章的大致脉络

    首先,介绍了transient的基本概念和基本用法
    然后,介绍深入分析一下transient关键字,并介绍几个需要掌握的问题
    最后,来个总结

    一、初识transient关键字

    其实这个关键字的作用很好理解,就是简单的一句话:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。

    概念也很好理解,下面使用代码去验证一下:

    public 

    然后我们在Test中去验证一下:

    public 

    从上面可以看出,在序列化SerializeUser方法中,首先创建一个序列化user类,然后将其写入到G://Test/template路径中。在反序列化DeSerializeUser方法中,首先创建一个File,然后读取G://Test/template路径中的数据。

    这就是序列化和反序列化的基本实现,而且我们看一下结果,也就是被transient关键字修饰的age属性是否被序列化。

    6ea48c23b224511ba532b53419a9d161.png

    从上面的这张图可以看出,age属性变为了0,说明被transient关键字修饰之后没有被序列化。

    二、深入分析transient关键字

    为了更加深入的去分析transient关键字,我们需要带着几个问题去解读:

    (1)transient底层实现的原理是什么?

    (2)被transient关键字修饰过得变量真的不能被序列化嘛?

    (3)静态变量能被序列化吗?被transient关键字修饰之后呢?

    带着这些问题一个一个来解决:

    1、transient底层实现原理是什么?

    java的serialization提供了一个非常棒的存储对象状态的机制,说白了serialization就是把对象的状态存储到硬盘上 去,等需要的时候就可以再把它读出来使用。有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思是transient修饰的age字段,他的生命周期仅仅在内存中,不会被写到磁盘中。

    2、被transient关键字修饰过得变量真的不能被序列化嘛?

    想要解决这个问题,首先还要再重提一下对象的序列化方式:

    Java序列化提供两种方式。

    • 一种是实现Serializable接口
    • 另一种是实现Exteranlizable接口。 需要重写writeExternal和readExternal方法,它的效率比Serializable高一些,并且可以决定哪些属性需要序列化(即使是transient修饰的),但是对大量对象,或者重复对象,则效率低。

    从上面的这两种序列化方式,我想你已经看到了,使用Exteranlizable接口实现序列化时,我们自己指定那些属性是需要序列化的,即使是transient修饰的。下面就验证一下

    首先我们定义User1类:这个类是被Externalizable接口修饰的

    public 

    然后我们就可以测试了

    public 

    上面,代码分了两个方法,一个是序列化,一个是反序列化。里面的代码和一开始给出的差不多,只不过,User1里面少了age这个属性。

    然后看一下结果:

    ae732e426bcabf6b638862cc550f5609.png

    结果基本上验证了我们的猜想,也就是说,实现了Externalizable接口,哪一个属性被序列化使我们手动去指定的,即使是transient关键字修饰也不起作用。

    3、静态变量能被序列化吗?没被transient关键字修饰之后呢?

    这个我可以提前先告诉结果,静态变量是不会被序列化的,即使没有transient关键字修饰。下面去验证一下,然后再解释原因。

    首先,在User类中对age属性添加transient关键字和static关键字修饰。

    然后,在Test类中去测试

    //序列化
    

    最后,测试一下,看看结果

    ceedf8a53884669b5a9aa887a598ebb1.png

    结果已经很明显了。现在解释一下,为什么会是这样,其实在前面已经提到过了。因为静态变量在全局区,本来流里面就没有写入静态变量,我打印静态变量当然会去全局区查找,而我们的序列化是写到磁盘上的,所以JVM查找这个静态变量的值,是从全局区查找的,而不是磁盘上。user.setAge(18);年龄改成18之后,被写到了全局区,其实就是方法区,只不过被所有的线程共享的一块空间。因此可以总结一句话:

    静态变量不管是不是transient关键字修饰,都不会被序列化

    三、transient关键字总结

    java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。像银行卡、密码等等这些数据。这个需要根据业务情况了。

    感谢大家支持

    最后还是给出我的维信公众号吧,谢谢关注,给新手一个支持

    0c1f853726f2f448f526b0ec68c91911.png
    展开全文
  • 其实也不是什么错误,就一直在delete processing中,就不删除数据。 信息如下: INFO - Hibernate 3.2.5 INFO - hibernate.properties not found INFO - Bytecode provider name : cglib INFO - using JDK ...
  • 有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思transient修饰的age字段,他的生命周期仅仅在内存中,不会被写到...

    1.transient关键字
    将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。
    例子(源自网络),给一个属性添加关键字transient

    在这里插入图片描述
    2.那transient有什么用
    有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思是transient修饰的age字段,他的生命周期仅仅在内存中,不会被写到磁盘中。
    在这里插入图片描述
    真是非常有用!
    在这里插入图片描述

    静态变量能被序列化吗?没被transient关键字修饰之后呢?
    静态变量是不会被序列化的,即使没有transient关键字修饰。
    在这里插入图片描述

    为什么静态变量无法被序列化呢?
    这就和JMM有关了,
    因为静态变量在全局区,本来流里面就没有写入静态变量,我打印静态变量当然会去全局区查找,而我们的序列化是写到磁盘上的,所以JVM查找这个静态变量的值,是从全局区查找的,而不是磁盘上。

    展开全文
  • 1.transient关键字 transient是针对在网络上传输的可以串化的对象(即实现了Serializable接口)来说的。 如果将对象不需要保存的数据声明为 transient,那么串化系统就会丢掉对象中的这些属性。这样对象的size就会...
      1.transient关键字

      transient是针对在网络上传输的可以串化的对象(即实现了Serializable接口)来说的。  
      如果将对象不需要保存的数据声明为   transient,那么串化系统就会丢掉对象中的这些属性。这样对象的size就会小一些,相对占用的网络资源就会小。

      2.volatile关键字
      我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。
      在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,只需要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
      Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
      Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
      使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
    注:我在单例模式中用到此关键字.
      3.strictfp关键字
      strictfp修饰的类中所有的方法都隐藏了strictfp修饰词,方法执行的所有浮点计算遵守IEEE 754标准,所有取值包括中间的结果都必须表示为float或double类型,而不能利用由本地平台浮点格式或硬件提供的额外精度或表示范围。


    展开全文
  • 原标题:Java中对象的串行化(serialization)和transient关键字本文摘自《Java程序员面试宝典》(电子工业出版社2017年4月版)串行化的概念和目的什么是串行化对象寿命随着生成该对象的程序终止而终止。有时候,可能...
  • 在LinkedHashMap 类中,看到有个关键字transient,它是什么意思呢? 下面援引百度百科解释: Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用...
  • transient 关键字有什么用途文章分类:Java编程 transient 关键字有什么用途 java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原...
  • java transient关键字

    2017-12-12 09:40:01
    用java这么久居然都不知道这个关键字,...这个关键字在java中的作用就是用它修饰的字段在被反序列化时会被忽略掉,什么意思呢。。我们来看看: public class Student implements Serializable { private String n
  • Java transient关键字

    2015-12-13 14:36:54
    最近看JDK源码,发现很多的变量用transient修饰,竟然不知道这个transient到底是什么意思,不觉让我这个自认为精通Java的人惊出一身冷汗,赶紧查了一下有关transient的只是,总是又长知识了,活到老学到老,我还只是...
  • java中的transient关键字

    2021-03-13 17:39:26
    文章目录transient简介使用序列化为什么要用transient关键字?transient的作用transient使用总结使用场景Exteranlizable接口实现序列化 原文: https://blog.csdn.net/u012723673/article/details/80699029 transient...
  • 关于java关键字transient

    2018-04-01 18:50:06
    以前不知道transient什么意思,现在特意补充下知识的盲点。1.transient的作用和使用方法当一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以...
  • 1. native簡單講,呼叫其他語言(c,c++之類)做出來的dll做法1.利用java做個介面供其他語言實作(也就是宣告成native)2.用javah產出.h;3.用其他語言實現native方法4.編譯成dll5.... strictfp意思是FP-str...
  • 我看见某处transient private TrackDAO trackDAO;谷歌是你的朋友——第一个点击——你也可以先看看序列化是什么。It marks a member variable not to beserialized when it is persisted tostreams of bytes. When ...
  • java中的transient

    2012-01-09 17:27:19
    引用 最近一段时间想把集合部分复习下,上午没事情做,读读jdk自带的src,看ArrayList类时...transient关键字是什么意思啊!学java零零散散也有1年了,真是孤陋寡闻啊……  看看下面的例子,一个登陆时,密码与ID
  • Java中transient的使用说明

    千次阅读 2016-12-22 08:36:21
    Java中的transient关键字,从字面意义理解,transient为短暂的意思transient应用于class的field上,即说明该field为短暂的,那对于1个成员变量,短暂的成员变量意味着什么transient 修饰的变量,在类实例的序列...
  • 之前在看ArrayList的源码的时候就遇到了这个关键字,不知道它是什么意思,但是那个时候太忙了就跳过了,最近在看LinkedList的时候又遇到了这个关键字,突然想起了,就决心把它整理一下,说实话java里的基础知识还是...
  • Serializable & transient

    千次阅读 2009-02-25 15:30:00
    serialize是什么意思? 这个词,在中文中翻译为串行化或者序列化。这两个翻译应该说几乎都无法表达它的实际意义。如果你原本不懂,给你翻译了,你还是不懂。 事实上这是IO存储中的一个概念。计算机中所有的内容都...
  • 很明显异常的意思是,引用了一个没保存的对象,而我的操作是点修改,即需要根据ID查询实体,那查询为什么会存在保存的操作呢?经仔细排查后得出结论 实体类如下: [code="java"] package ...
  • transient 关键字的用途

    2007-06-23 17:00:00
    序列化是什么意思?java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身。这可以极大地方便网络上的一些操作,...
  • [quote]最近一段时间想把集合部分复习下,上午没事情做,读读jdk自带的src,看...[/code]transient关键字是什么意思啊!学java零零散散也有1年了,真是孤陋寡闻啊…… 看看下面的例子,一个登陆时,密码与ID,密...
  • 今天在对两张一对多关系的表进行增加数据时,其中主表的数据增加成功了,但是子表却没有数据,这是什么原因导致的呢?在网上查询了一番之后,找到了一个解决的办法:将主表的 .hbm.xml 中的set设置为 inverse="false...
  • 一、前言我们在学习JDK源码时,如果大家有留心,应该会经常看到关键字:transient !但不知道有多少人去真正了解过该关键字的作用。二、初识transienttransient,中文意思:短暂的!那么,它有什么用呢?这就涉及到 ...
  • 头插入和尾插入是什么意思,首先我们知道,HashMap的实现原理是数组+单链表的形式,当出现hash冲突的时候,元素会以链表的形式存储,JDK1.7中元素插入链表是从头部插入,JDK1.8中是从尾部插入。 看看JDK1.8中...
  • java笔记

    2015-03-04 11:14:00
    1、java中的关键字transient什么意思 使用transient修饰符来标识一个成员变量在序列化子系统中应被忽略。transient:使用对象:字段介绍:字段不是对象持久状态的一部分,不应该把字段和对象一起串起。在JPA实体中...
  • 面试乱谈

    千次阅读 2004-07-28 14:59:00
    一网友面试的帖子 今天倒一家公司...附笔试题目:哪位知道答案就写出来,以免以后的人少走弯路 1、transient声明什么意思? 如: transient String str; 2、servlet声明周期? 3、EJB中home接口Remote接口做什么用

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

transient什么意思