Hibernate实体类编写规则和主键策略
一、实体类的编写规则
1、属性要是私有的。
2、要有公开的setter和getter方法供外界访问和修改。

3、每一个实体类要有一个属性作为唯一值(一般都是使用对于数据表的主键)。

4、建议数据类型不要使用基本的数据类型,而是使用相应的包装类。

5、Java中对应的包装类
| 基本数据类型 | 对应包装类 |
| int | Integer |
| char | Character |
| boolean | Boolean |
| float | Float |
| double | Double |
| short | Short |
| long | Long |
| byte | Byte |
使用包装类的原因:因为有时候使用基本数据类型无法准确表示一些场景。
例:score代表学生的成绩,但是在考试时可能存在缺考的情况,如果使用int数据类型,则score = 0表示考了分,但是缺考还是score =
0,这样无法区分;如果使用Integer,则要是缺考,score = null;这样就可以区分是考了0分还是缺考。
二、主键生成策略
1、Hibernate要求在一个实体中必须要有一个属性作为唯一值,这个唯一值一般都对应表中的主键。
2、主键分类
自然主键:把具有业务含义的字段作为主键,称之为自然主键。
代理主键:把不具有业务含义的字段作为主键,称之为代理主键。
3、主键的常见生成策略有七种
(1)increment :用于long、short或int类型的,由Hibernate自动由递增的方式生成唯一标识符,每次增长1.
只有当没有其他线程向同一张表中插入数据时使用。不能在集群情况下使用,适用于代理主键。
(2)identity:采用底层数据库提供的本身提供的主键生成标识符,前提是数据库必须支持自增长的数据类型。
在DB2、mysql、MS SQL SERVER、Sybase和HypersonicSQL数据库中可以使用该策略,该策略
要求在数据库中把主键定义为自增长,适用于代理主键。
(3)sequence:Hibernate根据底层数据库序列生成标识符。条件是数据库要支持序列,Oracle数据库可以使用该策略
适用于代理主键。
(4)hilo:hilo:通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
(5)native:根据底层数据库对自动生成表示符的能力来自动选择identity、sequence和hilo三种生成器中的一种。
适合跨数据库平台开发,适用于代理主键。
(6)uuid:Hibernate采用128位的UUID来生成字符,使用16进制表示,使用该策略时主键必须定义为String类型,
由于其所占的空间较多,使用较少,适用于代理主键。
(7)assigned:由Java程序负责生成标识符,如果在配置文件中不配置<generator></generator>标签,则默认为
该策略,适用于自然主键。
Hibernate实体类编写规则和主键策略的更多相关文章
- Hibernate的映射文件中基于主键的双向1对1的关联
1.Hibernate中采用基于主键的映射策略是,有一端(任意一端)的主键生成策略要是foreign,根据对方的主键来生成自己的主键,它的实体不能拥有自己的主键生成策略,如我的配置文件: <?x ...
- 因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 。。。
因为相同类型的其他实体已具有相同的主键值.在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified&quo ...
- Hibernate 主键策略
Hibernate主键生成策略 .自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
在日常使用Entity Framework中,数据更新通常会用到.下面就简单封装了一个DBContext类 public partial class EFContext<T> : DbCo ...
- 附加类型“UniversalReviewSystem.Models.ApplicationUser”的实体失败,因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值
在使用asp.net Identity2 的 UserManager RoleManager 时,同时还有其他仓储类型接口,能实现用户扩展信息的修改,用户注册没有问题.当修改用户信息时,出现了如下异常 ...
- hibernate.hbm.xml必须必须配置主键
hibernate.hbm.xml必须必须配置主键 <id name="XXid" type="java.lang.long" column=" ...
- Spring boot JPA 用自定义主键策略 生成自定义主键ID
最近学习Spring boot JPA 学习过程解决的一些问题写成随笔,大家一起成长.这次遇到自定义主键的问题 package javax.persistence; public enum Gener ...
- JPA主键策略
JPA 自带的主键策略有 4 种,在枚举 javax.persistence.GenerationType 中,分别是:TABLE.SEQUENCE.IDENTITY.AUTO. TABLE:通过表产 ...
- Mybatis-Plus默认主键策略导致自动生成19位长度主键id的坑
原创/朱季谦 某天检查一位离职同事写的代码,发现其对应表虽然设置了AUTO_INCREMENT自增,但页面新增功能生成的数据主键id很诡异,长度达到了19位,且不是从1开始递增的-- 我检查了一下,发 ...
随机推荐
- C#设计模式系列:代理模式(Proxy Pattren)
一.引言 在软件开发过程中,有些对象有时候会由于网络或者其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让 ...
- C#成员设计建议
所谓成员,是指类型的字段和方法.在成员设计时,掌握一定原则可以避免设计上的陷阱. 1.不要为抽象类提供公开的构造方法 抽象类可以有构造方法,但是抽象类不能实例化.如果编程人员没有制定构造方法,编译器会 ...
- django drf 深入ModelSerializer
serializer用起来稍微麻烦,可以使用ModelSerializer,类似于django里的Form与ModelForm 1.定义ModelSerializer from rest_framew ...
- 通过api获取句柄控制其他窗体
很多时候,编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的 ...
- kvm虚拟机静态迁移
1.静态迁移就是虚拟机在关机状态下,拷贝虚拟机虚拟磁盘文件与配置文件到目标虚拟主机中,实现的迁移. (1)虚拟主机各自使用本地存储存放虚拟机磁盘文件 本文实现基于本地磁盘存储虚拟机磁盘文件的迁移方式, ...
- js中闭包和对象相关知识点
学习js时候,读到几篇不错的博客.http://www.cnblogs.com/yexiaochai/p/3802681.html一,作用域 和C.C++.Java 等常见语言不同,JavaScrip ...
- Heap堆
#pragma once#include<iostream>using namespace std;#include<vector> template<class T&g ...
- xshell连接centos虚拟机的几点注意
我家用电脑使用联通的宽带,使用virtualbox装了centos6,连接方式使用NAT网络,还有一个是网络地址转换(NAT),不清楚区别是什么,使用xshell连接 当使用cd /etc/sysco ...
- Alluxio学习
介绍 Alluxio(之前名为Tachyon)是世界上第一个以内存为中心的虚拟的分布式存储系统.它统一了数据访问的方式,为上层计算框架和底层存储系统构建了桥梁.应用只需要连接Alluxio即可访问存储 ...
- 编程开发之--Oracle数据库--存储过程和存储函数(1)
1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or re ...
