Hibernate bean 对象配制文件

Hibernate bean 对象配制文件


class Person{

    private int pid;
}
1 配制主键
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="cn.Person" table="t_person">
        <!-- 主键 -->
        <id name="pid">
            <generator class="native"></generator>
        </id>
    </class>

</hibernate-mapping>
  • class 相关设置
    name 对应的bean数据类对象路径  例如这里使用的是 cn 包下的 Person类 

    table 对应的表的名称 
    select-before-update="true" 这个属性的时候 
    在进行更新的操作,会先进行查询操作,如果数据有改变那么就进行更新操作,如果数据没有改变,就不进行更新操作 

    在判断是否进行了修改,其是判断的是快照缓存区
    class 可设置动态 insertupdate,默认值:false

    dynamic-insert="true" 如果生产insert语句,属性内容为null,生产的sql语句中将没有该字段。

    dynamic-update="true" 只有内容被修改才进行更新。默认更新所有。
        注意:如果使用动态更新,数据必须是查询获得的,此时修改的内容将被更新,其他内容不变。
    class 设置懒加载  
    lazy = "true" 默认为true
  • 主键配制说明
<id></id> 标签中 可设置相关的属性
属性名对应值
nameOID 属性名称 也就是对应对象名称
column表字段列名
access确定访问属性或字段
length表字段长度
type表字段类型
unsaved-valuesave或update方法使用依据 String ,默认null,如果使用unsaved-value=”abc” ,当执行save方法,设置“abc”相当之前null
    generator 标签
    主键生成策略,hibernate根据设置生成OID的值方案
                                                      
                                                                                                                                                                                                                                                                                                                                                                                                   
generator标签 class对应名称class 对应值 案例
1 incrementhibernate 自己维护表的数据自动增强,在执行insert语句执之前,先查询。
会有:高并发、或集群 存放问题。
2 identity hibernate 将使用数据库底层自动增强,如 mysql quto-increment
3 sequence hibernate 将使用数据库底层序列。例如:oracle 序列
4 hilo hibernate采用高低位算法(不支持自动增强,也不支持序列) 例 4
hilo标签下 table ,设置数据库中,另一个表A的表名。
hilo标签下 column,表A的列名
hilo标签下 max_lo,一次操作多少条记录。100表示可以允许一次操作100条记录。
hilo标签下 算法:max_lo * next_value + next_value
5 native 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个
提示以上5个类型要求:整形(long, short 或者 int)
6 uuid随机字符串32长度
提示以上6种OID值都是有hibernate自动生成:代理主键
7 assigned自然主键,生成手动设置。例如身份证
  • 例 4
<generator class="hilo">
            <param name="table">hi_value</param>
            <param name="column">next_value</param>
            <param name="max_lo">100</param>
</generator>


2 配制其他属性
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>



    <class name="cn.Person" table="t_person">

        <property name="name" 
                  length="50" 
                  column="name"   
                  type="string" 
                  access="property">
        </property>

    </class>


</hibernate-mapping>
  • property 相关设置
    <property> 可以设置,允许当前属性是否在sql语句中 。默认值:true

    insert="false" 表示生产insert语句,没有当前字段。
    update="false" 表示生产update语句,没有当前字段。

    案例 : 
    <property name="title" insert="false" update="false"></property>
  • name : 默认用于配置javabean属性名称
  • length : 配置长度,字符串默认255,mysql类型 varchar(255)
  • column : 当前属性对应表中字段(列)名称,默认name的值
方式1:column属性(attribute) , <property column="">
方式2:子标签 <property> <column name="name"></column>
  • type: 数据字段类型
    方式1:hibernate类型,例如:string
    方式2:java类型,例如:java.lang.String
    方法3:mysql类型,例如:varchar(50)
            <column name="name" sql-type="varchar(50)" />
    日期时间类型
            date , 日期  java.util.Date , 对应jdbc类型:java.sql.Date
            time , 时间  java.util.Date , 对应jdbc类型:java.sql.Time
            timestamp,时间戳 java.util.Date (注意:时间戳随着数据更改变化) , 对应jdbc类型:java.sql.Timestamp
    项目使用:
            字符串、long (date.getTime())、日期时间类型
            使用数据的datetime 表示日期时间。

  • access ,用于确定当前属性如何进行数据封装
    property : 默认值,hibernate采用javabean属性 与 表字段进行对应。在javabean必须提供 getter/setter方法
    field : hibernate采用 javabean 字段 与 表字段进行对应。 可以没有getter/setter方法
            例如:private String username;
    noop : 提供给hibernate hql使用,数据库没有对应字段。一般不使用。
    precision 和 scale 给 oracle配置,在mysql没有作用。
                  precision 配置数字位数
                    scale 配置小数位数 
                    例如:numeric(precision,scale)  , 12.34  numeric(4,2)


3 多对一配制
方案一 
  • 多方的配制
//name属性为当前订单中的名称 
//calss 为多对一 中 一所代表的对象
//column 为多对一 之间联系的外键 
<many-to-one 
        name="customer" class="com.Customer" column="customer_id">
</many-to-one>

  • 一方的配制
    //name 代表本类中属性
    //inverse 属性默认为false,设置为true,代表 一方不去对 多方进行维护 
    <set name="orderSet" inverse="true">
        //key 标签中确定 一对多 之间的联系外键 
        <key column="customer_id"></key>
        //one-to-many 标签代表 一对多的 目标类
        <one-to-many class="com.Order"/>

    </set>
方案二 
  • 多方的配制
//name属性为当前订单中的名称 
//calss 为多对一 中 一所代表的对象
//column 为多对一 之间联系的外键 
<many-to-one 
        name="customer" class="com.Customer" column="customer_id">
</many-to-one>

  • 一方的配制

清单配制

    //name 代表本类中属性
    //cascade 
    <set name="orderSet" cascade="save-update">
        //key 标签中确定 一对多 之间的联系外键 
        <key column="customer_id"></key>
        //one-to-many 标签代表 一对多的 目标类
        <one-to-many class="com.Order"/>

    </set>
 cascade 
    设置为none , 没有级联操作

 cascade 
    设置为 save-update,级连保存或者更新 当save一方的时候,如果这时关联了瞬时态的多方,那么将触发级联操作,将瞬时态的多方转为持久态,也就是多执行了一次insert,最后再执行update

cascade 
    设置为 delete,级连删除 当删除一方的时候,会同时去删除其所关联的多方  

cascade  设置为 delete-orphan,孤儿删除 

    例如在  客户与订单  一对多,一个客户对应多条订单 

    当我们移除客户的一条订单的时候,Hibernate 默认方式是将订单从表中的对应的订单数据的外键置为了null,当我们设置了 column=" delete-orphan " 时,Hibernate会先将订单从表中的对应的订单数据的外键置为Null,再执行删除操作

cascade  设置为 all,代表 可以拥有 save-updatedelete 总和


cascade  设置为 all-delete-orphan,代表 所有    
4 多对多配制
  • 一方的配制
<set name="studentSet" table="t_student_course">
            <key column="course_id"></key>
            <many-to-many class="com.Student" 
                column="student_id">
            </many-to-many>
</set>
  • 另一方的配制
<set name="courseSet" table="t_student_course">
            <key column="student_id"></key>
            <many-to-many class="com.Course" 
                        column="course_id">
            </many-to-many>
        </set>
  • 说明
多对多需要中间表来建立对应,set标签下的table就是用来设置中间表的名称的

key 标签是用来设置本类在中间表就对应的列
many-to-many 标签 中,calss 对应的另一方的类,colum 对应的另一方在中间表中对应的列
  • 注意

在一对多 和多对多关系映射中 可设置 fetch 属性,与lazy属性

fetch="join" ,lazy无效,hibernate 将使用“迫切左外连接”,底层执行sql语句就是“左外连接”
        只执行一条select,将当前对象及关联对象数据一次性查询出来。


fetch="select" ,默认值,执行多条select语句
        lazy="false" 立即执行,在执行get方法时,立即执行多条select语句。
        lazy="true" 延迟执行,在执行get方法时先查询客户Customer,直到使用Order数据时才查询Order
        lazy="extra" 极其懒惰,在执行get方法时先查询客户Customer(select t_customer),如果需要order 订单数,将执行聚合函数只查询数量(select count() t_order),如果需要详情再查询详情(select t_order))。


fetch="subselect" ,采用子查询
        lazy 取值与 fetch="select" 相同。
        注意:必须使用Query进行查询

5 类中组件配制

使用 component 标签

public class Person {

    private Integer pid;    //OID 值
    private String name;

    //组合
    private Address homeAddress;
    private Address companyAddress;

}

public class Address {
    //值对象 (vo 值对象/po 持久对象/bo 业务对象)

    private String addr;
    private String tel;

}

<hibernate-mapping>
    <class name="com.Person" table="t_person">
        <id name="pid">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>

        <component name="homeAddress" class="com.Address">
            <property name="addr" column="homeAddr"></property>
            <property name="tel" column="homeTel"></property>
        </component>

        <component name="companyAddress" class="com.Address">
            <property name="addr" column="companyAddr"></property>
            <property name="tel" column="companyTel"></property>
        </component>

    </class>

</hibernate-mapping>
6 继承映射配制
  • 继承关系类描述
public class Employee {

    private Integer eid;
    private String name;

}


public class HourEmployee extends Employee {

    private int rate;   //零钱

}


public class SalaryEmployee extends Employee {

    private int salary;

}
  • 方式一 使用 sub-class 标签来处理
    所有的内容都保存在一张表中 
<hibernate-mapping>
    <class name="com.Employee" table="t_employee" discriminator-value="员工">
        <id name="eid">
            <generator class="native"></generator>
        </id>
        <discriminator column="etemp"></discriminator>
        <property name="name"></property>

        <subclass name="com.SalaryEmployee" discriminator-value="正式员工" >
            <property name="salary"></property>
        </subclass>
        <subclass name="com.HourEmployee" discriminator-value="小时工">
            <property name="rate"></property>
        </subclass>

    </class>

</hibernate-mapping>
  • 方式二 使用joined-subclass 标签来处理
    每个子类都有一张表 

<hibernate-mapping>
    <class name="com.Employee" table="j_employee">
        <id name="eid">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>

        <joined-subclass name="com.HourEmployee" table="j_hour">
            <key column="hid"></key>
            <property name="rate"></property>
        </joined-subclass>
        <joined-subclass name="com.SalaryEmployee" table="j_salary">
            <key column="sid"></key>
            <property name="salary"></property>
        </joined-subclass>

    </class>

</hibernate-mapping>
    eid 是j_employee表中的主键,同时关联着从表j_hour中主键rate  与从表 j_salary 中主键 sid
  • 方式三 使用union-subclass 标签来处理
    每个子类都有一张表 
    所有的子类 与 父类 共用主键策略

<hibernate-mapping>
    <class name="com.Employee" table="u_employee">
        <id name="eid">
            <generator class="increment"></generator>
        </id>
        <property name="name"></property>

        <union-subclass name="com.HourEmployee" table="u_hour">
            <property name="rate"></property>
        </union-subclass>

        <union-subclass name="com.SalaryEmployee" table="u_salary">
            <property name="salary"></property>
        </union-subclass>

    </class>

</hibernate-mapping>
早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userDao': Unsatisfied dependency expressed through method 'setSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactoty' defined in class path resource [spring-hibernate.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: invalid configuration at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:667) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93) at sy.test.TestHibernate.test(TestHibernate.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactoty' defined in class path resource [spring-hibernate.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: invalid configuration at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:659) ... 38 more Caused by: org.hibernate.MappingException: invalid configuration at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2160) at org.hibernate.cfg.Configuration.configure(Configuration.java:2113) at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:348) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ... 48 more Caused by: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 7; 文档无效: 找不到语法。 at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:396) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:284) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:229) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:614) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3135) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:880) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) at org.dom4j.io.SAXReader.read(SAXReader.java:465) at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2157) ... 52 more
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页