id生成策略: assigned:手动的生成id. increment:oracle mysql 都可以用 identity: id是字符型的 大小一定要大于32位 sequence:oracle可以特有的,mysql不支持sequence 语法:create sequence sequence_name start with 1 increment by 2;(按两个字节增长) hilo: 最大值有自己的算法 跨数据库的 seqhilo: oracle可以用 mysql不支持 uuid: guid: native: 默认的是使用叫 hibernate_sequence 这个名字的 sequence(oracle中)插入的数据有点好玩 select: foreign: -------------------------------------------------------------------------------------------------------------------- 1.native 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制), native就是将主键的生成工作交由数据库完成,hibernate不管(很常用) 2.Assigned 在插入数据的时候主键由用户自己添加,hibernate也不管(很常用) 3.increment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器, 所以在多个实例运行的时候不能使用这个方法 4.sequence 调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到: sequence_name(Oracle中很常用) 5.identity 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段, 要设定sequence(MySQL 和 SQL Server 中很常用) 6.hilo 使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型, 名称是next_hi(比较少用)我们也可以自己设置自定义的表名和字段名 7.sehilo 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持 Sequence 的数据库,如 Oracle(比较少用) 8.uuid.hex hibernate会算出一个128位的唯一值插入 9.uuid.string hibernate会算出一个16位的值插入 10.foreign 使用外部表的字段作为主键 11.select 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用) -------------------------------------------------------------------------------------------------------------------------- load()方法是假定你所读取的对象是肯定存在的... 而get则是尝试访问..如果没有则返回null.而load就会抛出Exception cant load ... 个人认为这两个方法唯一的区别就是为了实现不同的业务需要...从src上看性能是一样的。 get是直接查询数据库,如果查不到就返回null。 Load会首先从内存中装载,如果以前没有装载或查询出来,才开始查询数据库,某些情况下效率会高一点。 如果类是通过代理映射的,load()方法会返回一个对象,这是一个未初始化的代理,并且直到你调用该对象的某 方法时才会去访问数据库,如果数据库中并不存在这条数据,而你去使用它的方法必然会抛出异常,所以你得在使用到这个对象的各处捕获异常,使用起来相对麻烦。但这是使用了代理的情况,如果没有使用代理,只是简单的load,那查不到数据就会抛出异常了。第二种答案: hibernate中session.get/load方法都能通过指定实体类名和id从数据库中读取指定的记录,并且返回与之对映的实体对象。但是它们也有很大的区别 1)如果没有找到符合条件的数据get方法返回的是null,而load方法会抛出一个objectnotfoundexpection的异常。 2)load方法可以返回实体的代理类实例,而get方法直接返回实体。 3)load方法可以充分在一级缓存和二级缓存中查找现有的数据,而get方法则只在一级缓存查找,如果没有发现就直接调用sql在数据库中查找。
generator
最新推荐文章于 2024-08-16 18:39:05 发布