Hibernate是一种Java语言下的对象关系影射解决(ORM,Object Relation Mapping)方案。它是使用LGPL许可证的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的影射,提供了一个使用方便的框架。Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有。
它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate。
Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大的缩短手动处理SQL和JDBC上的开发时间。
主流的ORM框架有JBoss公司的Hiberate、Oracle公司的TopLink、Apache组织的OJB、Sun公司的JDO。
JDBC
jdbc是一个比较底层的东西,可以灵活的写SQL语句。但由于Java是面向对象的,jdbc没有做到使数据能够面向对象编程,使程序的思考仍停留在SQL语句上。
Hibernate的安装配置
参考:http://blog.csdn.net/chrp99/article/details/8477962
解压获取必须的类库文件。
将下载目录/hibernate.jar和/lib下的hibernate运行时必须的包加入classpath中:需要使用的jar包以及jar包对应含义如上:
(1)配置文件hibernate.cfg.xml和hibernate.properties
这两个文件的作用一样,提供一个即可推荐XML格式
(2)可以在配置文件指定:
数据库的URL、用户名、密码、JDBC驱动类、方言等。
启动时Hibernate会在CLASSPATH里找这个配置文件。
hibernate中字段为空时错的异常
如果实体类中有private double xxproperty;
则会报异常,修改方法:
private Double xxproperty;
原因是在java中不能对double、int等基本数据类型赋值null,但能对封装类赋值null值。
表名的映射
//代表此类参与ORM映射,此注解必须要有
@Entity
//代表user这个类映射了一个表user50,如果表名和类名一样,此注解可以省略
@Table(name="user50")
public class User {
主键的映射
//主键,此注解必须要有
@Id
//数据库表中主键列名为id,如果实体类属性名和列名相同,此注解可以省略
@Column(name="id")
//主键的维护策略
@GenericGenerator(name="inc50",strategy="increment")
@GeneratedValue(generator="inc50")
private Integer userID;
属性映射成表的字段
//@Column(name="name")//此属性要映射到名为name的列上,若属性名和列名相同,则注解可以省略
private String name;
日期类型的映射
@Column(name="birth")
//如果属性是日期格式,可以设置日期的保存规格
//time:只保存时间 date:只保存日期 timestamp:(默认)日期+时间
@Temporal(TemporalType.DATE)
private Date birthday;
表之间的关系是一对一的映射
//关系属性:告知Passport它的关系属性
//mappedBy"对方中映射着外键的关系属性==Passport表中有一个关系属性,名字是person50"
@OneToOne(mappedBy="person50")
//ALL:增删改都可以级联(cascade)
//save-update:增加和更新可以级联
//delete:删除可以级联
//如果不设置,则增删改都不可以级联
//注意:查询例外,不受级联权限的控制,默认级联。
@Cascade(value=CascadeType.ALL)
private Passport passport50;
//关系属性
@OneToOne
//JoinColumn:代表是从表,name的值代表:Passport表中外键名为person_id
@JoinColumn(name="person_id")
//@Cascade
private Person person50;
表之间的关系是一对多的映射
user表 1:n order表
@OneToMany(mappedBy="user")
//ALL:增删改都可以级联(cascade)
//save-update:增加和更新可以级联
//delete:删除可以级联
//如果不设置,则增删改都不可以级联
//注意:查询例外,不受级联权限的控制,默认级联。
@Cascade(value=CascadeType.DELETE)
private Set<Order> orders=new HashSet<Order>();
//关系属性
@ManyToOne
//JoinColumn:name代表关系属性映射的列
@JoinColumn(name="user_id")
private User user
表之间的关系 是多对多的映射
//关系属性
//EAGER: 查询时关联的数据也同时取出放入内存中,因为在内存里,所以在session外也可以取
@ManyToMany(fetch=FetchType.EAGER)
//中间表,两个外键: joinColumns=指向自己的外键 inverseJoinColumns=指向对方的外键
@JoinTable(name="r_c_s"
,joinColumns={@JoinColumn(name="stu_id")}
,inverseJoinColumns={@JoinColumn(name="cour_id")})
@Cascade(value=CascadeType.ALL)
private Set<Course> courses=new HashSet<Course>();
//关系属性
@ManyToMany
@JoinTable(name="r_c_s"
,joinColumns={@JoinColumn(name="cour_id")}
,inverseJoinColumns={@JoinColumn(name="stu_id")})
@Cascade(value=CascadeType.ALL)
private Set<Student> students=new HashSet<Student>();
最后欢迎大家访问我的个人网站: 1024s