Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

Clob:文本大对象,最长4G

Blob:二进制数据大对象,最长4G

util:

public class HibUtil {
  private static SessionFactory sessionFactory;
  static{
    //获取配置信息 hibernate.cfg.xml
    Configuration configuration = new Configuration().configure();
    //创建一个 ServiceRegistry的实例
    //首先获得其标准建造器,此处用了建造者模式 builder模式来创建对象
    //创建一个标准的构建器
    StandardServiceRegistryBuilder ssb = new StandardServiceRegistryBuilder();
    //建造(得到)ServiceRegistry的实例此处一定要传入//configuration.getProperties()否则会报错UnsupportedOperationException
    ServiceRegistry build = ssb.applySettings(configuration.getProperties()).build();
    //获得session工厂 一个数据库对应一个 SessionFactory
    sessionFactory = configuration.buildSessionFactory(build);
  }
  public static Session getSession(){
    return sessionFactory.openSession();
  }
  public static void main(String[] args) {
  }
}

hibernate.cfg.xml:

<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
  <!-- 1:链接数据库的配置 -->
  <property name="hibernate.dialect">
    org.hibernate.dialect.Oracle10gDialect
  </property>
  <property name="hibernate.connection.driver_class">
    oracle.jdbc.driver.OracleDriver
  </property>
  <property name="hibernate.connection.username">scott</property>
  <property name="hibernate.connection.password">tiger</property>
  <property name="hibernate.connection.url">
    jdbc:oracle:thin:@localhost:1521:orcl
  </property>
  <!-- 2: 全局性配置 -->
  <property name="hibernate.show_sql">true</property>
  <property name="hibernate.format_sql">true</property>
  <!-- 仅供测试时使用 ,公司内禁止使用 -->
  <property name="hibernate.hbm2ddl.auto">update</property>
  <!-- 3: 映射文件的配置 -->
  <mapping resource="com/huawei/hib/po/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>

po:

public class Address {
  private Integer addrId;
  private String addrName;
  public Integer getAddrId() {
    return addrId;
  }
  public void setAddrId(Integer addrId) {
    this.addrId = addrId;
  }
  public String getAddrName() {
    return addrName;
  }
  public void setAddrName(String addrName) {
    this.addrName = addrName;
  }
}

public class PersonName {
  private String firstName;
  private String lastName;
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
}

import java.sql.Blob;
import java.sql.Clob;

public class Person {
  private PersonName personName;
  private Integer age;
  private Clob txtObj;
  private Blob imgObj;
  private Address address;
  public PersonName getPersonName() {
    return personName;
  }
  public void setPersonName(PersonName personName) {
    this.personName = personName;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
  public Clob getTxtObj() {
    return txtObj;
  }
  public void setTxtObj(Clob txtObj) {
    this.txtObj = txtObj;
  }
  public Blob getImgObj() {
    return imgObj;
  }
  public void setImgObj(Blob imgObj) {
    this.imgObj = imgObj;
  }
  public Address getAddress() {
    return address;
  }
  public void setAddress(Address address) {
    this.address = address;
  }
}

Person.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
  package="com.huawei.hib.po">
  <class name="Person" table="test_person" >
    <!-- 联合主键映射 -->
    <composite-id name="personName" class="PersonName">
      <key-property name="firstName" column="first_name" />
      <key-property name="lastName" column="last_name" />
    </composite-id>
    <property name="age" />
    <property name="txtObj" column="txt_Obj" />
    <property name="imgObj" column="img_Obj" />
    <!--组合关系映射 -->
    <component name="address" class="Address">
      <property name="addrId" column="addr_id" />
      <property name="addrName" column="addr_name" />
    </component>
  </class>
</hibernate-mapping>

dao:

public class PersonDao {
  public static void main(String[] args) throws FileNotFoundException {
    Session session = HibUtil.getSession();
    Address address = new Address();
    address.setAddrId(1);
    address.setAddrName("成都");
    PersonName personName = new PersonName();
    personName.setFirstName("三");
    personName.setLastName("张");
    Person p = new Person();
    p.setPersonName(personName);
    p.setAge(20);
    Blob imgObj = Hibernate.getLobCreator(session).createBlob(new FileInputStream("E:/123.jpg"),1200000);
    Clob txtObj = Hibernate.getLobCreator(session).createClob("成都是个美丽的地方");
    p.setTxtObj(txtObj);
    p.setImgObj(imgObj);
    p.setAddress(address);
    Transaction tx = session.beginTransaction();
    session.save(p);
    tx.commit();
    session.close();
  }
}

时间: 2024-10-06 18:25:49

Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)的相关文章

Hibernate中联合主键生成策略

一.xml配置联合主键 单独设计一个类,作为主键类,如StudentPK A.实现序列化(Serializable接口) B.重写equals()和hashCode() 为什么要从写equals()和hashCode()方法? hashCode相同的会被存储在hash表的同一位置,当找到特定的hashcode之后,会根据equals()方法判断是否是相同的对象,来查找到对应的数据. 小实验1: (1)创建联合主键类StudentPK package com.zgy.hibernate.model

hibernate里联合主键composite-id映射,查询单个主键的问题(转)

今天项目中遇到这个问题,搞了大半天,我郁闷...hibernate里联合主键配置(多个字段一起作为主键) <class name="com.cskj.hibernate.map.BbWjjc" table="bb_wjjc" schema="dbo" catalog="wjgl">        <composite-id name="id" class="com.cskj.hi

hibernate里联合主键composite-id映射,查询单个主键的问题

今天项目中遇到这个问题,搞了大半天,现在记录下来hibernate里联合主键配置(多个字段一起作为主键) <class name="com.cskj.hibernate.map.BbWjjc" table="bb_wjjc" schema="dbo" catalog="wjgl"> <composite-id name="id" class="com.cskj.hibernate

hibernate 注解 联合主键映射

联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将 该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注 解为@Id 第二.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,最后 在主类中(该

hibernate配置联合主键

配置联合主键有多种方式,这里仅记录我使用的一种. 直接上代码 使用@IdClass,红色标注. package com.szy.operation.stat.model.agent.school; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass;

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner 格式为: <id name="departmentId" type="java.lang.Integer"> <column name="department_i

Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/Annotation) 联合主键 一对一单向外键联合主键(Xml/Annotation) 一对一组件关联(XML/Annotation) 理解组件 领域驱动设计——自动生成数据库脚本 一对一关系的小结 一些出错问题的总结 自动生成数据库脚本 一般在项目开发过程中,我们的习惯是先建好数据库和表,然后在进

hibernate 联合主键生成机制(组合主键XML配置方式)

hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体如下: 可以使用一个组件作为一个实体类的标识符.你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意:在 Hibernate3 中,第二个要求并非是 Hi

IT忍者神龟之Hibernate联合主键下,主键生成策略

如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体如下: 可以使用一个组件作为一个实体类的标识符.你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意:在 Hibernate3 中,第二个要求并非是 Hibernate 强制必须的.但最好这样做. 不能使用一个 Ide