ID生成策略:主键手工设定很不方便,在我们实际工作中在MySQL里面用自增字段auto increment,在oracel中一般用sequence。所以把表建成auto increment,对于类里面对象的对应的值就不能指定了,得靠程序或数据库自动生成,hibernate或JPA就实现了这样的功能,我们可以通过设置告诉这个字段怎么生成,这样写程序的时候就不用设定了。这个就叫ID的生成策略。
动手实验:
使用xml时,常用
native根据底层数据库的能力选择identity, sequence 或者hilo中的一个。identity对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。sequence在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
使用annotation,使用注解@GeneratedValue默认值是auto相当于xml里面的native
@SequenceGenerator(name="teacherSEQ", sequenceName="teacherSEQ_DB")
@GeneratedValue(strategy=GenerationType.SEQUENCE)
@TableGenerator
联合主键:假设sutdent的id和name是它的主键。单独写一个类作为学生的主键类StudentPK.java,在主键类里面必须要重写equals、hashCode方法,实现serializable接口(为什么?),serializable把当前对象序列化,这样就可以直接写到硬盘上,也可以直接读出来,也可以直接传送。为什么要序列化呢?作为Student这个对象来说,它在数据库表里可能存在多条记录,如果把这多条记录放到内存里就是多个Student对象,每个对象都有一个主键StudentPK对象。系统做集群,好多个服务器,如果这台服务器当机了,可以把这台服务器里的对象传给另外一台服务器,就需要实现序列化,但是这种情况并不多见。还有一种情况,加入内存满了,可以使用虚拟内存(把硬盘上一块空间作为内存使用)。这种情况下就可以把序列化了的那一部分内容先暂时放到硬盘上去。主键类为什么要重写equals和hashCode呢?是为了保证唯一性,不仅 在数据库中保证唯一性,我们还要把数据放到内存中,好多student对象,里面都有自己的studentpK,那么每个对象之间怎么区分开来&#x