通过组件来实现组合主键的步骤: 这里举个例子,一个表有学生编号,科目编号,成绩,显然学生编号和科目编号的组合才能作为主键
1.编写组合主键的属性的类,该类必须实现Serializable
public class ScoreId implements Serializable { private int stuId;//学生编号 private int subjectId;//科目编号 public int getSubjectId() { return subjectId; } public void setSubjectId(int subjectId) { this.subjectId = subjectId; } public int getStuId() { return stuId; } public void setStuId(int stuId) { this.stuId = stuId; } }2 .主类
public class Score { private ScoreId scoreId; private double result;//成绩 public ScoreId getScoreId() { return scoreId; } public void setScoreId(ScoreId scoreId) { this.scoreId = scoreId; } public double getResult() { return result; } public void setResult(double result) { this.result = result; } }3 .映射文件编写
<hibernate-mapping package="cn.siggy.pojo"> <class name="Score"> <composite-id name="scoreId" class="ScoreId"> <key-property name="stuId"></key-property> <key-property name="subjectId"></key-property> </composite-id> <property name="result"></property> </class> </hibernate-mapping>4 .测试(session对象获得等封装在了HibernateUtil里面,略)
@Test public void testSave() throws HibernateException{ Session session=null; Transaction tx=null; try{ session=HibernateUtil.getSession(); tx=session.beginTransaction(); Score s=new Score(); ScoreId sid=new ScoreId(); sid.setStuId(2); sid.setSubjectId(6); s.setResult(89); s.setScoreId(sid); session.save(s); tx.commit(); } catch(HibernateException e){ if(tx!=null){ tx.rollback(); e.printStackTrace(); throw e; } }finally{ HibernateUtil.closeSession(); } }大对象映射 在pojo类中使用了大对象,比如Blob类和Clob类。比如Blob我们以前都是通过文件上传来来存储图片,如果我们要把它存放到数据库,那么如下。 1.pojo类
public class Student { private int id; private String name; private int age; //存放大数据 可以存放4G的内容 private Blob image; private Clob introduce; //省略get/set }2.hbm配置 需要指定大对象的类型
<hibernate-mapping package="cn.siggy.pojo"> <class name="Student"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <property name="age"/> <property name="image" type="java.sql.Blob"/> <property name="introduce" type="java.sql.Clob"/> </class> </hibernate-mapping>3.测试(session对象获得等封装在了HibernateUtil里面,略)
@Test public void testSave() throws HibernateException, SerialException, SQLException{ Session session=null; Transaction tx=null; try{ session=HibernateUtil.getSession(); tx=session.beginTransaction(); Student stu = new Student(); stu.setName("尹志平"); stu.setAge(23); Blob blob = new SerialBlob("ttt".getBytes()); Clob clob = new SerialClob("sss".toCharArray()); stu.setImage(blob); stu.setIntroduce(clob); session.save(stu); tx.commit(); } catch(HibernateException e){ if(tx!=null){ tx.rollback(); e.printStackTrace(); throw e; } }finally{ HibernateUtil.closeSession(); } }组件是一个被包含的对象 比如这里指一个人有很多个地址,直接把地址值写在一张表的时候,只涉及一张表,没有建立另外一张表和这种表地址id的外键,这个时候用主键。(但是不推荐这种表关系,因为这样维护起来很麻烦)
主类
public class Teacher { private int id; private String name; private String sex; private Address address; //省略get/set }类Teacher的组件
public class Address { private String addr1; private String addr2; private String addr3; //省略get/set }Teacher.hbm.xml
<hibernate-mapping package="cn.siggy.pojo"> <class name="Teacher"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <property name="sex"/> <!-- 组件 --> <component name="address" class="Address"> <property name="addr1"/> <property name="addr2"/> <property name="addr3"/> </component> </class> </hibernate-mapping>测试(session对象获得等封装在了HibernateUtil里面,略)
@Test public void testSave() throws HibernateException, SerialException, SQLException{ Session session = null; Transaction tx = null; try{ session = HibernateUtil.getSession(); tx = session.beginTransaction(); Teacher t = new Teacher(); t.setName("老裴"); t.setSex("男"); Address address = new Address(); address.setAddr1("西三旗"); address.setAddr2("西直门"); address.setAddr3("南六环"); t.setAddress(address); session.save(t); tx.commit(); }catch (HibernateException e) { if(tx!=null) tx.rollback(); e.printStackTrace(); throw e; }finally{ HibernateUtil.closeSession(); } }