1.Hibernate是将操作数据库变为操作对象,Hibernate进行了orm映射,所以hibernate可以从数据库表生成对应的pojo类和映射文件,也可以从pojo类映射文件生成对应的数据库信息。
根据对象信息将对应的关系信息生成:
@Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport export = new SchemaExport(cfg); //第一个参数 是否打印 数据库脚本 //第二个参数 是否将脚本导入数据库执行 export.create(true, true); }
或者也可以添加通用配置信息实现该功能:
<!-- hbm2ddl.auto create:(如果表存在先删表) 再创建 create-drop:先删表 再创建 update:如果表存在 则直接操作,如果不存在先创建 在执行操作 validate:不会自动创建表--默认 --> <property name="hbm2ddl.auto">update</property>
2. 在实际应用中表之间的关系是比较复杂的。常见的有4种关系:一对一,一对多,多对一,多对多。如果有两张表t_teacher 和 t_student 表,学生和老师的关系是多对一的关系。表结构如下:
3. 类的结构信息:Teacher.java
public class Teacher { private int id; private String name; public Teacher() { } public Teacher(String name) { super(); this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Student.java
public class Student { private int id; private String name; private String sex; private Teacher teacher; public Student() { // TODO Auto-generated constructor stub } public Student(String name, String sex) { super(); this.name = name; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } }
4. 映射文件:Teacher.hbm.xml:
<hibernate-mapping> <class name="cn.sxt.vo.Teacher" table="t_teacher"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> </class> </hibernate-mapping>
Student.hbm.xml
<hibernate-mapping> <class name="cn.sxt.vo.Student" table="t_student"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <property name="sex"/> <!-- 配置多对一的关联映射 name配置的是 一的一端在多的一端的属性名 column 配置的是 一的一端在多的一端表中的外键 --> <many-to-one name="teacher" column="tid"/> </class> </hibernate-mapping>
5. 测试:
public class HibernateTest { private Session session=null; @Before public void setUp(){ session = HibernateUtil.getSession(); } @After public void tearDown(){ HibernateUtil.close(); } @Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport export = new SchemaExport(cfg); //第一个参数 是否打印 数据库脚本 //第二个参数 是否将脚本导入数据库执行 export.create(true, true); } @Test public void testInit(){ Transaction tx = null; try { tx = session.beginTransaction(); Teacher t1 = new Teacher("nico"); Teacher t2 = new Teacher("michile"); Student s1 = new Student("liming","男"); s1.setTeacher(t1); Student s2 = new Student("hanmei","女"); s2.setTeacher(t1); Student s3 = new Student("jim","男"); s3.setTeacher(t1); session.save(t1); session.save(t2); session.save(s1); session.save(s2); session.save(s3); tx.commit(); } catch (Exception e) { if(tx!=null) tx.rollback(); } } @Test public void testGet(){ Student stu = (Student)session.get(Student.class, 1); System.out.println(stu.getName()+"---"+stu.getSex()+"----"+stu.getTeacher().getName()); } }