-
一对一单向外键关联(二)
如何向数据库中保存一对一单向外键的数据表
//先生成一个身份证对象-外键表
IdCard card = new IdCard("123456789012345678","张敬岭");
//再生成学生对象-主表,如果Date类型是util中的则插入不了数据,换成sql的就可以了,原因是hibernate和数据库的不兼容
Students s = new Students(card,"男",new Date(),"太极拳");
//先保存身份证类再保存students
session.save(card);
session.save(s);
查看全部 -
一对一单向外键:(写在主表内)
@oneToOne(cascade=CascadeType.ALL)
cascade:级联关系
CascadeType.ALL:全级联关系-----级联删除,级联更新,级联添加
@JoinColumn(name="pid",unique=true)
name:主表的外键,unique:外键也是唯一的
注意:先保存外键对象,再保存主表对象
顺序:
1,编写Students实体类(必须添加@Entity注解才能在数据库创建表)
2,编写IdCard实体类(pid,pname)
@Entity设置实体类,
@Id
@GeneratedValue(generator="pid")
@GenericGenerator(name="pid",strategy="assigned")
@Column(length=18)
设置主键
设置构造函数,getset等
3,将IdCard类当做Students的属性,并在此属性的get方法上设置外键主键
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="pid",unique=true)
4,配置xml文件,映射类
5,编写测试文件,SchemaExport生成数据表
查看全部 -
实体间的映射关系:
一对一:一个公民对应一个身份证号码
一对多(多对一):一个公民有多个银行账号
多对多:一个学生有多个老师,一个老师有多个学生
查看全部 -
关系映射级别注解:
1,一对一单向外键
2,一对一双向外键关联
3,一对一单向外键联合主键
4,多对一单向外键关联
5,一对多单向外键关联
6,一对多双向外键关联
7,多对多单向外键关联
8,多对多双向外键关联
查看全部 -
@Transient:
标识该属性不是一个到数据库表的字段的映射,ORM框架可以忽略该属性
查看全部 -
@EmbeddedId:使用嵌入式主键类实现复合主键
注意:嵌入式主键类必须实现Serializable接口,必须有默认的public无参数的构造方法,必须覆盖equals和hashCode方法
创建一个类,此类中的字段是其他实体类的复合主键:
public class StudentsPK implements Serializable{
//实现序列化接口后最好设定一个序列化版本号
//序列化版本号是为了反序列化成功而设置的,若是不想被反序列化则可以设置一个动态的版本号,可以到有道云笔记中查看
private static final long serialVersionUID=1L;
private String id;//身份证号码
private String sid;//学号
public StudentsPK(){}
get/set方法
equals和tostring方法
}
//测试
首先标识嵌入类和嵌入类id
然后给嵌入类赋值:StudentPK pk=new StudentPK();
pk.setID("123345");pk.setSid("12345");
然后再Students s=new Students(pk,"张三丰","男"。。。。);
最后:session.save(s);tx.commit();
查看全部 -
@embedded是注释属性的,表示该属性的类是嵌入类
注意:同时嵌入类也必须标注@Embeddable注解
查看全部 -
@Column注解:描述了数据库表中该字段的详细定义
常用属性:
name:默认属性和字段名一致,不一致则用此属性设置
nullable:表示该字段是否允许为null,默认为true
unique:表示该字段是否是唯一标识,默认为false
length:标识该字段的大小,仅对string类型的字段有效,默认255
insertable:表示在ORM框架执行插入操作时,该字段是否应该出现在INSERT语句中,默认为true
updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,比如birthday字段
查看全部 -
1,字符型主键使用
public void addStudents(){
//创建hibernate配置对象
Configuration config = new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildService.........
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
//创建会话
Session session = sessionFactory.getCurrentSession();
//创建事务
Transaction tx = session.beginTransaction();
//创建一个学生对象
Address add = new Address("700005","湖北武当山","13641095182");
Students s = new Students("S0000001","张三丰","男",new Date(),"太极拳",add);
session.save(s);
tx.commit();
}
查看全部 -
1,主键是整型的,就可以使用自动增长类型,auto(根据底层数据库自动选择)
@Id
@GeneratedValue(strategy=GenerationType.AUTO)//(主键策略,默认为auto)
private int sid;
2,主键是字符串类型,要么不写上@GeneratedValue,要么就用hibernate的注解而不是JPA的@GeneratedValue形式
@Id
@GeneratedValue(generator="sid")//先设置一个策略生成器
@GenericGenerator(name="sid",strategy="assigned")//字符串主键生成策略
@Column(length=8)
private String sid;
查看全部 -
1,@GeneratedValue(strategy=GenerationType,generator="")
设置主键的生成策略
2,strategy表示主键生成策略,取值有:
GenerationType.Auto:根据底层数据库自动选择(默认)
必须是整型
GenerationType.INDENTITY:根据数据库的Identity字段生成
GenerationType.SEQUENCE:使用sequence来决定主键的取值
oracle没有自动增长类型,类似的是序列
GenerationType.TABLE:使用指定表来决定主键取值
结合@TableGenerator使用
3,使用:
@Id
@TableGenerator(name="tab_cat_gen",allocationSize=1)
@GeneratedValue(Strategy=GenerationType.Table)
Generator-表示主键生成器的名称,这个属性通常和ORM框架相关,例如:Hibernate可以指定uuid等主键生成方式
查看全部 -
1,@Id:如果有多个属性定义为主键属性,该实体类必须实现serializable接口(implements Serializable)
2,若是作为主键的字段是字符串类型,那么必须设置好字段的长度才行
因为如果不设置的话默认长度为255,但是mysql规定主键字段不能过长很明显255已经超出了限制
这时候需要在字段上设置@Column(length=8)
查看全部 -
@Id,@SequenceGenerator,@GeneratedValue,@Column,@Embedded,@EmbeddedId,@Lob,@Version,@Basic,@Transient
查看全部 -
1,@Embeddable:标识一个非Entity类可以嵌入到另一个Entity类中作为属性而存在----嵌入类
2,@Embeddable标识的类作为一个实体类的属性存在时,在数据库的数据表中的表现是,会将嵌入类中的几个属性也作为字段
比如实体类为student,嵌入类为address,address中有邮编,地址,联系电话三个字段,那么在数据表中就会存在此三个字段,而不是将address作为一个整体字段
查看全部 -
1,@Table注解 常用属性:name,catalog,schema
2,shema属性和catalog属性,各个数据库支持不一致
oracle: 不支持catalog,schema就是 oracle user ID
mysql:不支持catalog,schema就是数据库名字
sqlserver:catalog是数据库名,不支持schema
DB2:不清楚
3,@Table和@Entity配合使用
@Entity
@Table(name="student")
public class student{
}
查看全部
举报