8_实现Serializable接口_重写equals和hashCode方法
来源:互联网 发布:小米文件管理器源码 编辑:程序博客网 时间:2024/06/08 01:30
控制台java application运行报错:
19:20:51,916 WARN RootClass:233 - composite-id class does not override equals(): com.mym.hibernate.model.StudentPK(意思是:composite-id没有重写equals()方法,在com.num.hibernate.model.StudentPK)Exception in thread "main" org.hibernate.MappingException: composite-id class must implement Serializable: com.mym.hibernate.model.StudentPK(意思是:composite-id 必须实现Serializable接口,在com.mym.hibernate.model.StudentPK类中) at org.hibernate.mapping.RootClass.checkCompositeIdentifier(RootClass.java:243) at org.hibernate.mapping.RootClass.validate(RootClass.java:224) at org.hibernate.cfg.Configuration.validate(Configuration.java:1149) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1334) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)19:20:51,918 WARN RootClass:238 - composite-id class does not override hashCode(): com.mym.hibernate.model.StudentPK(意思是:composite-id没有重写hashCode()方法,在com.num.hibernate.model.StudentPK) at com.mym.hibernate.model.StudentTest.beforeClass(StudentTest.java:16) at com.mym.hibernate.model.StudentTest.main(StudentTest.java:41)
控制台报错:
17:56:09,344 WARN RootClass:233 - composite-id class does not override equals(): com.mym.hibernate.model.StudentPK17:56:09,346 WARN RootClass:238 - composite-id class does not override hashCode(): com.mym.hibernate.model.StudentPK
Junit报错:
org.hibernate.MappingException: composite-id class must implement Serializable: com.mym.hibernate.model.StudentPK(意思是:composite-id 必须实现Serializable接口,在com.mym.hibernate.model.StudentPK类中) at org.hibernate.mapping.RootClass.checkCompositeIdentifier(RootClass.java:243) at org.hibernate.mapping.RootClass.validate(RootClass.java:224) at org.hibernate.cfg.Configuration.validate(Configuration.java:1149) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1334) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) at com.mym.hibernate.model.StudentTest.beforeClass(StudentTest.java:16) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)java.lang.NullPointerException at com.mym.hibernate.model.StudentTest.afterClass(StudentTest.java:20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:37) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
我们先来看为什么要实现Serializable接口:
这个接口的作用是将对象实现序列化,将数据变成数据流的形式,在网络、主机间进行传输,需要使用的时候,直接调用即可。跟EJB差不多,如果我们要实现java对象的序列化,就必须用到Serializable接口
本例是在Student类的主键类中进行,而student类中的数据在内存中都是一个个对象,后期可能用到集群,好多台服务器对外提供服务,当有一台服务器down机了,需要将数据传到另外一台主机上,则需要实现序列化;还有可能如果将硬盘模拟成内存使用,将一部分对象暂时放入硬盘中,用到时再调用这些对象,也需要用到序列化。在rmi和ejb使用的时候 作为参数传递的对象必须是serializable的
综上所述,Student类的主键类需要实现序列化。
相关EJB的理解博文可以参考:http://blog.csdn.net/jojo52013145/article/details/5783677)
(a.EJB实现原理: 就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通信。
b.RMI实现原理 :就是通过Java对象可序列化机制实现分布计算。
c.服务器集群: 就是通过RMI的通信,连接不同功能模块的服务器,以实现一个完整的功能)
当我们实现Serializable接口后,再次出现了警告,说我们必须实现equals()和hashCode()方法:
19:33:13,613 WARN RootClass:233 - composite-id class does not override equals(): com.mym.hibernate.model.StudentPK19:33:13,615 WARN RootClass:238 - composite-id class does not override hashCode(): com.mym.hibernate.model.StudentPK19:33:14,084 INFO SchemaUpdate:155 - Running hbm2ddl schema update19:33:14,085 INFO SchemaUpdate:167 - fetching database metadata19:33:14,086 INFO SchemaUpdate:179 - updating schema19:33:14,090 INFO DatabaseMetadata:119 - table not found: Student19:33:14,114 INFO TableMetadata:65 - table found: hibernate._teacher19:33:14,115 INFO TableMetadata:66 - columns: [zhicheng, id, title, birthdate, _name]19:33:14,115 INFO TableMetadata:68 - foreign keys: []19:33:14,115 INFO TableMetadata:69 - indexes: [primary]19:33:14,117 INFO DatabaseMetadata:119 - table not found: Student19:33:14,130 INFO TableMetadata:65 - table found: hibernate.generator_table19:33:14,130 INFO TableMetadata:66 - columns: [pk_value, pk_key]19:33:14,130 INFO TableMetadata:68 - foreign keys: []19:33:14,131 INFO TableMetadata:69 - indexes: []19:33:14,131 DEBUG SchemaUpdate:203 - create table Student (id integer not null, name varchar(255) not null, age integer, primary key (id, name))19:33:14,187 INFO SchemaUpdate:217 - schema update completeHibernate: insert into Student (age, id, name) values (?, ?, ?)
为什么要实现equals()和hashCode()方法呢?
我们知道,当我们在数据库中比较两个对象的不同,是通过主键来比较的,在内存中,我们也需要比较两个对象的不同,而判断不同的方法就是equals()和hashCode()方法。
equals()方法用来判断主键id和主键name是否同时都相等,如果相等,则与此对象相等。
hashCode()方法用来判定:当把对象装到一个hash表中,如果要查hash表里面的内容,必须首先对比这个对象的hashCode
hash表:相当于一个数组,数组中有一个个位置,每一个位置都相当于一个链表,链表上装着hash码相同的对象, 如果有两个对象A和B,计算出他们的hash码,如果相同相同,则会被装在同一个位置,如果后期需要找到某一个对象,则会先计算出这个对象的hash码,然后直接找到hash表中hash码相同的位置,然后再遍历该位置上的对象,如果跟要找的对象equals,则表示找到对象。
阅读全文
0 0
- 8_实现Serializable接口_重写equals和hashCode方法
- 联合主键实现Serializable接口,重写equals和hasCode方法
- 联合主键实现Serializable接口,同时重写equals和hasCode方法 的原因和步骤
- 重写equals()与hashcode()方法,及comparable接口的实现
- 重写hashCode和equals方法
- 重写equals和hashCode方法
- 重写hashCode和equals方法
- 重写hashcode和equals方法
- 重写equals() 和 hashCode()方法
- 重写hashCode()和equals()方法
- 重写equals和hashcode方法
- HashCode和equals方法重写
- 重写equals() 和 hashCode()方法
- 重写hashCode()方法和重写equals()方法
- 重写equals()方法和hashcode()方法
- 重写equals方法和hashcode方法
- HashMap中重写hashCode和equals方法
- java重写equals和hashCode方法
- Linux curl命令详解
- LOJ刷题记录:SHOI2016(2036-2041)
- module——import命令(笔记)
- js闭包判断点击的元素顺序
- 第一阶段_第一部分_工具介绍
- 8_实现Serializable接口_重写equals和hashCode方法
- PHP_Apache安装
- luoguP3168 [CQOI2015]任务查询系统
- 2.6 输入/输出流
- 嵌入式处理器-2.4
- springboot + dubbo 添加 serviceFilter
- Android开发中为什么有些变量会以m开头
- WebStorm用法及快捷键
- UE4 在UI/UMG中显示三维模型