当前位置:首页 » 编程语言 » hibernate原生sql返回
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

hibernate原生sql返回

发布时间: 2022-05-27 23:19:34

A. Hibernate中CriteriaQuery可以使用原生sql作为排序条件么

Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的,这种方式弥补了HQL、Criterion查询的不足,在操作和使用上往往更加的自由和灵活,如果使用得当,数据库操作的效率还会得到不同程度的提升。

Hibernate对原生
SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询:

session.createSQLQuery(String sql);

SQLQuery实现了Query接口,因此你可以使用Query接口中提供的API来获取数据。

最简单的示例

//获取所有查询结果
session.createSQLQuery("select * from note").list();
//仅获取第一条结果
session.createSQLQuery("select * from note where id = 1").uniqueResult();

使用预处理SQL

预处理SQL的好处自然不必多说,除了众所周知的能够防止SQL注入攻击外,还能够在一定程度上提高SQL的查询效率。SQLQuery提供了众多的接口来分别设置不同类型的参数,诸如setBigDecimal、setBinary、setDouble等,详参SQLQuery的JavaDoc,此处不再赘述。这里仅重点说一下通用的SQL参数设置接口setParameter。

如下代码示范了如何使用SQLQuery执行预处理SQL:

SQLQuery query = session.createSQLQuery("select * from note where id = ?");
//设置第一个参数的值为12,即查询ID=12的note
query.setParameter(0, 12);
List list = query.list();
...

这里需要注明一点,无论是通过不同类型参数的设置接口来设置SQL参数,还是通过setParameter来设置参数,下标都是从0开始的,而不是从1开始的!

使用自定义的结果转换器处理查询结果

SQLQuery
接口预留了setResultTransformer接口以实现使用用户自定义的ResultTransformer结果集转换器处理查询结果。
ResultTransformer接口非常简单,只有两个方法,分别用来转换单行数据和所有结果数据。经过自定义ResultTransformer生成的实体,并未加入Session,因此是非受管实体。

如下代码,示范了如何将单行数据装入LinkedHashMap对象中:

query.setResultTransformer(new ResultTransformer() {

@Override
public Object transformTuple(Object[] values, String[] columns) {
Map<String, Object> map = new LinkedHashMap<String, Object>(1);
int i = 0;
for(String column : columns){
map.put(column, values[i++]);
}
return map;
}

@Override
public List transformList(List list) {
return list;
}
});

如果不设置自定义的ResultTransformer转换器,则Hibernate将每行返回结果的数据按照结果列的顺序装入Object数组中。

这里介绍一个工具类:Transformers,它提供了一些常用的转换器,能够帮助我们快速转换结果集,如Transformers.aliasToBean(Note.class)能够将查询结果依别名注入到Note实体中。

使用标量

使用SQLQuery执行原生SQL时,Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。如果要避免过多的使用ResultSetMetadata,或者只是为了更加明确的指名返回值,可以使用addScalar()。

session.createSQLQuery("select * from note where id = 1")
.addScalar("id", LongType.INSTANCE)
.addScalar("name", StringType.INSTANCE)
.addScalar("createtime", DateType.INSTANCE);

这个查询指定了SQL查询字符串,要返回的字段和类型.它仍然会返回Object数组,但是此时不再使用ResultSetMetdata,而是明确的将id,name和
createtime按照Long,
String和Date类型从resultset中取出。同时,也指明了就算query是使用*来查询的,可能获得超过列出的这三个字段,也仅仅会返回这三个字段。

对全部或者部分的标量值不设置类型信息也是可以的:

session.createSQLQuery("select * from note where id = 1")
.addScalar("id")
.addScalar("name")
.addScalar("createtime", DateType.INSTANCE);

没有被指定类型的字段将仍然使用ResultSetMetdata获取其类型。注意,字段不区分大小写,同时不能够指定不存在的字段!

关于从ResultSetMetaData返回的java.sql.Types是如何映射到Hibernate类型,是由方言(Dialect)控制的。假若某个指定的类型没有被映射,或者不是你所预期的类型,你可以通过Dialet的registerHibernateType调用自行定义。

如果仅指定了一个scalar,那么...

Date createTime = (Date)session.createSQLQuery("select * from note where id = 1")
.addScalar("createtime", DateType.INSTANCE)
.uniqueResult();

如果我们的SQL语句使用了聚合函数,如count、max、min、avg等,且返回结果仅一个字段,那么Hibernate提供的这种提取标量结果的方式就非常便捷了。

实体查询

上面的查询都是返回标量值的,也就是从resultset中返回的“裸”数据。下面展示如何通过addEntity()让原生查询返回实体对象。

session.createSQLQuery("select * from note where id = 1").addEntity(Note.class);
session.createSQLQuery("select id,name,createtime from note where id = 1").addEntity(Note.class);

这个查询指定SQL查询字符串,要返回的实体。假设Note被映射为拥有id,name和createtime三个字段的类,以上的两个查询都返回一个List,每个元素都是一个Note实体。

假若实体在映射时有一个many-to-one的关联指向另外一个实体,在查询时必须也返回那个实体,否则会导致发生一个"column
not found"的数据库错误。这些附加的字段可以使用*标注来自动返回,但我们希望还是明确指明,看下面这个具有指向Dog的many-to-one的例子:

session.createSQLQuery("select id,note,createtime,author from note where id = ?").addEntity(Note.class);

author字段即为Note实体和Author实体的关联字段,只需在查询时得到该字段的值,Hibernate即可使用该值找到对应的关联实体。如上例中,note.getAuthor()即可返回当前Note所属的Author对象。

处理关联和集合类

通过提前抓取将Author连接获得,而避免初始化proxy带来的额外开销也是可能的。这是通过addJoin()方法进行的,这个方法可以让你将关联或集合连接进来。

session.createSQLQuery("select {note.*}, {author.*} from note note, user author where note.author = author.id")
.addEntity("note", Note.class)
.addJoin("author", "note.author");

上面的例子是多对一的关联查询,反过来做一对多的关联查询也是可以的。如下的例子中,author.notes表示该用户发表的所有日记(Note),Set集合类型:

session.createSQLQuery("select {author.*},{note.*} from note note, user author where author.id = ? and note.author = author.id")
.addEntity("author", User.class)
.addJoin("note", "author.notes");

注意:join查询会在每行返回多个实体对象,处理时需要注意。

别名和属性引用

假若SQL查询连接了多个表,同一个字段名可能在多个表中出现多次,这会导致SQL错误。不过在我们可以通过使用占位符来完美地解决这一问题。

其实在上例中已经用到了占位符:

session.createSQLQuery("select {note.*}, {author.*} from note note, user author where note.author = author.id")
.addEntity("note", Note.class)
.addJoin("author", "note.author");

这个查询指明SQL查询语句,其中包含占位附来让Hibernate注入字段别名,查询并返回的实体。

上面使用的{note.*}和{author.*}标记是作为“所有属性”的简写形式出现的,当然你也可以明确地罗列出字段名。但如下的范例代码中我们让Hibernate来为每个属性注入SQL字段别名,字段别名的占位符是表别名
+ . + 属性名。

注意:属性名区分大小写,而且不能够在where子句中使用占位符。

SQLQuery query = session.createSQLQuery("select note.id as {note.id},note as {note.note},createtime as {note.createTime},author as {note.author}, {author.*} from note, user author where note.id = ? and note.author = author.id");
query.addEntity("note", Note.class);
query.addJoin("author", "note.author");

大多数情况下,上面的别名注入方式可以满足需要,但在使用更加复杂的映射,比如复合属性、通过标识符构造继承树,以及集合类等等情况下,则需要更加复杂的别名注入方式。

下表列出了使用别名注射参数的不同方式:

B. 如何将hibernate 原生sql查询的结果获取出来

Session session = sf.openSession();
session.beginTransaction();
SQLQuery q = session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class);
List<Category> categories = (List<Category>)q.list();
for(Category c : categories) {
System.out.println(c.getName());
}

C. java hibernate 原生sql查询。

//原生sql查询可以使用createSQLQuery(String sql)方法 下面代码表示查询所有的用户
List<User> users=session.createSQLQuery("select * from user").list();

D. hibernate 中 createSQLQuery() 用法,我想让它返回一个book对象,怎么写语句。

看上去,你的写法应该没啥问题。
不过这个b又不是占位符,你又是单表的查询,是不是应该把b去掉啊。
SQLQuery sqlquery = s.createSQLQuery("select * from Book b where b.name = bookName").addEntity(Book.class);

参考:http://hi..com/liheng666/blog/item/6b38d3c472d271a08226aca7.html

E. hibernate原生sql查询单列返回的是什么

其实是没有具体的返回的,执行的结果是org.hibernate.impl.SQLQueryImpl,根据你对返回结果的逻辑来决定你返回的类型,比如java.util.List,调用它的list()方法,调用iterater方法则返回java.util.Iterator.返回String则调用SQLQueryImpl的父类AbstractQueryImpl的getQueryString()....

F. [极品难]关于hibernate如何把原生sql查出的结果转化为对象

例如我们有一个照片的POJava code//照片poclass Photo{int id;string title;
double avgScore;//平均分,这个字段在数据库中是没有映射的,也就是 非持久化属性}//投票po ,每张照片对应多个vote记录class Vote{int id;int photoId;int score;}用sql = "select {p.*,avg(v.score) as p.avgScore} from photo p left join vote v on p.id = v.photoId ";
单纯的sql结果很满意,包含照片的信息和每张照片的平均分数。
代码如下:Query query = session.createSQLQuery(sql.toString()).addEntity(Photo.class);
运行后,没有错误,但是在SQL语句中的avg(v.score) as p.avgScore} 这一部分,没有被像我们预期的那样set进photo的avgScore属性中。
问题:我们如果遇到要用原生sql进行查询,并要将结果set进一个po中,其中set进po中的属性,不完全是被可持久化的,例如本例
中的avgScore属性。
PS: 请别和我说完全可以用hql等方式,这只是个简单的示例,目前是想研究原生sql对象映射问题。
我仔细看了那篇文章,addScalar这个的意思似乎只是把查出来的非属性结果进行类型绑定,我现在的困惑是如果把这个值自动绑定进po中~~
就像上面的例子,select出一个po,然后这个po中要有那个avgScore的属性值,目前我试过即使用addScalar明确avgScore的类型,还是不会自动set进po中。。
打印出的SQL:
sql: select {p.id,p.user_id,p.url,p.state,avg(v.score) as p.avgScore} from photos p where p.user_id = :userId and p.state in ( 0, 1 ) group by p.id order by p.id desc
报了个这个错:
44187 [http-8080-1] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1064, SQLState: 42000
44187 [http-8080-1] ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from photos p where p.user_id = 13 and p.state in ( 0, 1 ) group by p.id orde' at line 1
2009-9-3 12:04:39 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from photos p where p.user_id = 13 and p.state in ( 0, 1 ) group by p.id orde' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
如果不加{}那么就报在数据库找不到p.avgScore这列,因为p.avgScore是一个虚似的临时变量,非持久化属性。
我提问题时只是简单写的示例,省略了几个字段,
sql = "select p.id,avg(v.score) from photo p , vote v where p.id = v.photoId group by p.id";
这么写是可以,但不会被自动绑定进PO,我来问就是想知道在不调用SET方法的情况下能否自动把非字段属性绑定进PO。
您看看有没有自动的方式绑定进PO的。。
因为我返回avg(v.score) as p.avgScore,其实在p这个po中是有setAvgScore()这个方法的,可是终始不会被调用 。。。
我甚至做过这个测试,把avgScore()设成@Cloumn(insertable=false,updateable=false),还是不会自动set进po中。。

G. JAVA如何用Hibernate执行原生SQL返回List

//原生sql查询可以使用createsqlquery(string
sql)方法
下面代码表示查询所有的用户
list
users=session.createsqlquery("select
*
from
user").list();

H. mysql hibernate的sql查询怎么返回实体类

[java] view plain
sql为select a.*, b.id as childId, b.childName from a,b where a.id = b.id

当遇到Column '*' not found找不到的时候,首先检查该字段是否存在,如果存在还有这个错误,有两种解决办法
第一种:有可能是你的*字段取了别名,那么在查询的时候一定要指定改别名的类型,为已经存在的别名指定数据类型。只需要为最外层的有别名的字段指定类型即可。代码如下:

[java] view plain
SQLQuery query = session.createSQLQuery(sql).addScalar("别名", Hibernate.INTEGER);//指定别名的数据类型//多个别名可以连续写多个如:session.createSQLQuery(sql).addScalar("别名", Hibernate.INTEGER).addScalar("别名1",Hibernate.INTEGER);

I. java开发中,为什么我的sql语句在hibernate原生sql查询时查不到结果

是mysql的问题,将mysql的安装目录下的my.ini中的两个地方改为utf8解决。
如果忘记mysql的安装路径,可以win+r(开始-运行) 然后 services.msc
找到mysql服务,右键查看属性即可。

J. Hibernate3 使用原生sql 返回集能用hbm.xml配置文件映射到类里吗

不能

一.Hibernate映射文件的作用:

Hibernate映射文件是Hibernate与数据库进行持久化的桥梁

二,Hibernate映射文件主要内容:

(1).映射内容的定义:

Hibernate映射文件由<hibernate-mapping package="JavaBean所在包的全路径">节点定义映射内容并指定所对应的JavaBean的位置(也可以不在该节点中用package属性指定对应的JavaBean位置,而在该节点下的class节点中的name属性中指定)


(2).数据库和JavaBean的关联:

Hibernate映射文件中用<hibernate-mapping>节点下的

<class name="JavaBean名称" table="对应数据库中的表名">节点指定数据库表和JavaBean的关联。

( 该节点的父节点中用package属性指定了JavaBean的包名时用)/全路径(该节点的父节点中没用package属性指定JavaBean的包名时用)


(3).主键映射:

在<class >节点下用

<id name="数据库中主键在JavaBean中的属性名称" column="数据库中主键名" type="string">节点映射对应的主键,该节点必须有且只有一个(因为主键只有一个),同时必须放在<property ...>节点前

(4).普通字段映射:

在<class ...>节点下用

<property name="数据库中字段在JavaBean中的属性名称" column="数据库中的字段名" type="string"/>节点映射普通字段,该节点可有多个(一个字段用一个该节点来映射)

三,heibernate的主键映射方式:

在<id ...>节点下用<generator class="映射方式"/>节点指定Hibernate向数据库插入数据时主键的生成方式

lassigned:应用程序自身对id赋值。当设置<generator class="assigned"/>时,应用程序自身需要负责主键id的赋值,由外部程序负责生成(在session.save()之前为对象的主键设置值),无需Hibernate参与,一般应用在主键为自然主键时。例如XH为主键时,当添加一个学生信息时,就需要程序员自己设置学号的值,这时就需要应用该id生成器。

lnative:由数据库对id赋值。当设置<generator class="native"/>时,数据库负责主键id的赋值,最常见的是int型的自增型主键。例如,在SQLServer中建立表的id字段为identity,配置了该生成器,程序员就不用为该主键设置值,它会自动设置。

lidentity:采用数据库提供的主键生成机制,为long/short/int型列生成唯一标识如SQL Server、MySQL中的自增主键生成机制。

lhilo:通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

lseqhilo:与hi/lo类似,通过hi/lo算法实现的主键生成机制,只是主键历史状态保存在sequence中,适用于支持sequence的数据库,如Oracle。

lincrement:主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一个数据库有多个实例访问,这种方式应该避免使用

lsequence:采用数据库提供的sequence机制生成主键,用于用序列方式产生主键的数据库(如:Oracle、DB2等的Sequence),用于为long/short/int型列生成唯一标识,如:<generator class="sequence"><param name="sequence">序列名</param></generator>如Oracle sequence。

luuid.hex:由Hibernate基于128位唯一值产生算法,根据当前设备IP、时间、JVM启动时间、内部自增量等4个参数生成十六进制数值(编码后长度为32位的字符串表示)作为主键。即使是在多实例并发运行的情况下,这种算法在最大程度上保证了产生id的唯一性。当然,重复的概率在理论上依然存在,只是概率比较小。一般而言,利用uuid.hex方式生成主键将提供最好的数据插入性能和数据平台适应性。

luuid.string:与uuid.hex类似,只是对生成的主键进行编码(长度为16位)。在某些数据库中可能出现问题。

lforeign:使用外部表的字段作为主键。该主键一般应用在表与表之间的关系上,会在后面的表对应关系上进一步讲解。

lselect:Hibernate 3新引入的主键生成机制,主要针对遗留系统的改造工程。

由于常用的数据库,如SQLServer、MySQL等,都提供了易用的主键生成机制(如auto-increase字段),可以在数据库提供的主键生成机制上,采用native生成器来配置主键生成方式。


四,映射文件的元素结构和属性

1,根元素:<hibernate-mapping>,每一个hbm.xml文件都有唯一的一个根元素,包含一些可选的属性

[html]view plain

  • <hibernate-mappingpackage="com.demo.hibernate.beans">

  • <classname="User"...>

  • </hibernate-mapping>

  • <hibernate-mapping>

  • <classname="com.demo.hibernate.beans.User"...>

  • </hibernate-mapping>

  • (1).package: 指定当前映射文件对应的持久类的完整包名(如:package="entity.")
    (2).schema: 指定当前映射文件对应的数据库表的schema名
    (3).catalog: 指定当前映射文件对应的数据库表的catalog名
    (4).default-cascade: 设置默认的级联方式(默认值为none)
    (5).default-access: 设置默认的属性访问方式(默认值为property)
    (6).default-lazy: 设置对没有指定延迟加载的映射类和集合设定为延迟加载(默认值为true)
    (7).auto-import: 设置当前映射文件中是否可以在HQL中使用非完整的类名(默认值为true)

    hibernate-mapping节点的字节点:
    (1).class: 为当前映射文件指定对应的持久类名和对应的数据库表名
    (2).subclass: 指定多态持久化操作时当前映射文件对应的持久类的子类
    (3).meta: 设置类或属性的元数据属性
    (4).typedef: 设置新的Hibernate数据类型
    (5).joined-subclass: 指定当前联结的子类
    (6).union-subclass: 指定当前联结的子类
    (7).query: 定义一个HQL查询
    (8).sql-query: 定义一个SQL查询
    (9).filter-def: 指定过滤器

    2,<class>定义类:根元素的子元素,用以定义一个持久化类与数据表的映射关系,如下是该元素包含的一些可选的属性

    (1).name: 为当前映射文件指定对应的持久类名
    (2).table: 为当前映射文件指定对应的数据库表名
    (3).schema: 设置当前指定的持久类对应的数据库表的schema名
    (4).catalog: 设置当前指定的持久类对应的数据库表的catalog名
    (5).lazy: 设置是否使用延迟加载
    (6).batch-size: 设置批量操作记录的数目(默认值为1)
    (7).check: 指定一个SQL语句用于Schema前的条件检查
    (8).where: 指定一个附加的SQL语句的where条件
    (9).rowid: 指定是否支持ROWID
    (10).entity-name:实体名称 默认值为类名
    (11).subselect: 将不可变的只读实体映射到数据库的子查询中
    (12).dynamic-update: 指定用于update的SQL语句是否动态生成 默认值为false
    (13).dynamic-insert: 指定用于insert的SQL语句是否动态生成 默认值为false
    (14).insert-before-update: 设定在Hibernate执行update之前是否通过select语句来确定对象是否确实被修改了,如果该对象的值没有改变,update语句将不会被执行(默认值为false)
    (15).abstract: 用于在联合子类中标识抽象的超类(默认值为false)
    (16).emutable: 表明该类的实例是否是可变的 默认值为fals
    (17).proxy: 指定延迟加载代理类
    (18).polymorphism: 指定使用多态查询的方式 默认值为implicit
    (19).persister: 指定一个Persister类
    (20).discriminator-value: 子类识别标识 默认值为类名
    (21).optimistic-lock: 指定乐观锁定的策略 默认值为vesion
    class节点的字节点:
    (1).id: 定义当前映射文件对应的持久类的主键属性和数据表中主键字段的相关信息
    (2).property: 定义当前映射文件对应的持久类的属性和数据表中字段的相关信息
    (3).sql-insert: 使用定制的SQL语句执行insert操作
    (4).sql-delete: 使用定制的SQL语句执行delete操作
    (5).sql-update: 使用定制的SQL语句执行update操作
    (6).subselect: 定义一个子查询
    (7).comment: 定义表的注释
    (8).composite-id: 持久类与数据库表对应的联合主键
    (9).many-to-one: 定义对象间的多对一的关联关系
    (10).one-to-one: 定义对象间的一对一的关联关系
    (11).any: 定义any映射类型
    (12).map: map类型的集合映射
    (13).set: set类型的集合映射
    (14).list: list类型的集合映射
    (15).array: array类型的集合映射
    (16).bag: bag类型的集合映射
    (17).primitive-array: primitive-array类型的集合映射
    (18).query: 定义装载实体的HQL语句
    (19).sql-query: 定义装载实体的SQL语句
    (20).synchronize: 定义持久化类所需要的同步资源
    (21).query-list: 映射由查询返回的集合
    (22).natural-id: 声明一个唯一的业务主键
    (23).join: 将一个类的属性映射到多张表中
    (24).sub-class: 声明多态映射中的子类
    (25).joined-subclass: 生命多态映射中的来连接子类
    (26).union-subclass: 声明多态映射中的联合子类
    (27).loader: 定义持久化对象的加载器
    (28).filter: 定义Hibernate使用的过滤器
    (29).component: 定义组件映射
    (30).dynamic-component: 定义动态组件映射
    (31).properties: 定义一个包含多个属性的逻辑分组
    (32).cache: 定义缓存的策略
    (33).discriminator: 定义一个鉴别器
    (34).meta: 设置类或属性的元数据属性
    (35).timestamp: 指定表中包含时间戳的数据
    (36).vesion: 指定表所包含的附带版本信息的数据

    4,<id>定义主键:

    Hibernate使用OID(对象标识符)来标识对象的唯一性,OID是关系数据库中主键在Java对象模型中的等价物,在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系

    id节点的属性:
    (1).name: 指定当前映射对应的持久类的主键名
    (2).column: 指定当前映射对应的数据库表中的主键名(默认值为对应持久类的主键/属性名)
    (3).type: 指定当前映射对应的数据库表中的主键的数据类型
    (4).unsaved-value: 判断此对象是否进行了保存
    (5).daccess: Hibernate访问主键属性的策略(默认值为property)

    5.generator节点的属性:
    (1).class: 指定主键生成器
    (2).name: 指定当前映射对应的持久类的主键名
    (3).column: 指定当前映射对应的数据库表中的主键名(默认值为对应持久类中的主键名)
    (4).type: 指定当前映射对应的数据库中主键的数据类型
    (5).unique: 设置该字段的值是否唯一(默认值为false)
    (6).not-null: 设置该字段的值是否可以为null(默认值为false)
    (7).update: 设置update操作时是否包含本字段的数据(默认值为true)
    (8).insert: 设置insert操作时是否包含本字段的数据(默认值为true)
    (9).formula: 设置查询操作时该属性的值用指定的SQL来计算
    (10).access: Hibernate访问这个属性的策略(默认值为property)
    (11).lazy: 设置该字段是否采用延迟加载策略(默认值为false)
    (12).optimistic-lock: 指定此属性做更新操作时是否需要乐观锁定(默认值为true)

    6.property节点的属性:
    用于持久化类的属性与数据库表字段之间的映射,包含如下属性:

    (1)name:持久化类的属性名,以小写字母开头
    (2)column:数据库表的字段名
    (3)type:Hibernate映射类型的名字

    (4).formula: 设置当前节点对应的持久类中的属性的值由指定的SQL从数据库获取
    注:指定的SQL必须用()括起来,指定SQL中使用列时必须用表的别名加.加列名的方式访问,但如果指定SQL中要使用当前映射对应的列时不能用表的别名加.加列名的方式访问,而是直接访问即可
    如:formula="(select tn.columnName from tableName tn where tn.columnName=当前映射中的属性名)"
    (5).unique: 设置该字段的值是否唯一(默认值为false)
    (6).not-null: 设置该字段的值是否可以为null(默认值为false)
    (7).not-found: 设置当当前节点对应的数据库字段为外键时引用的数据不存在时如何让处理(默认值为exception:产生异常,可选值为ignore:对不存在的应用关联到null)
    (8).property-ref: 设置关联类的属性名,此属性和本类的关联相对应 默认值为关联类的主键
    (9).entity-name: 被关联类的实体名
    (10).lazy: 指定是否采用延迟加载及加载策略(默认值为proxy:通过代理进行关联,可选值为true:此对象采用延迟加载并在变量第一次被访问时抓取、false:此关联对象不采用延迟加载)
    (11).access: Hibernate访问这个属性的策略(默认值为property)
    (12).optimistic-lock: 指定此属性做更新操作时是否需要乐观锁定(默认值为true)

    7.one-to-one节点的属性:
    (1).name: 映射类属性的名字
    (2).class: 关联类的名字
    (3).formula: 绝大多数一对一关联都指向其实体的主键。在某些情况下会指向一个或多个字段或是一个表达式,此时可用一个SQL公式来表示
    (4).cascade: 设置级联操作时的级联类型
    (5).constrained: 表明当前类对应的表与被关联的表之间是否存在着外键约束默认值为false
    (6).fetch: 设置抓取数据的策略 可选值为 join外连接抓取、select序列选择抓取
    (7).property-ref: 设置关联类的属性名,此属性和本类的主键相对应 默认值为关联类的主键
    (8).access: Hibernate访问这个属性的策略(默认值为property)
    (9).lazy: 指定是否采用延迟加载及加载策略 默认值为proxy通过代理进行关联 可选值为 true此对象采用延迟加载并在变量第一次被访问时抓取、false此关联对象不采用延迟加载
    (10).entity-name: 被关联类的实体名


    8.many-to-one 元素:
    (1).name: 映射类属性的名字
    (2).class: 关联类的名字
    (3).formula: 绝大多数一对一关联都指向其实体的主键。在某些情况下会指向一个或多个字段或是一个表达式,此时可用一个SQL公式来表示
    (4).column: 中间关联表映射到目标关联表的关联字段
    (5).cascade: 设置级联操作时的级联类型
    (6).fetch: 设置抓取数据的策略 默认值为select序列选择抓取 可选值为join外连接抓取
    (7).lazy: 指定是否采用延迟加载及加载策略 默认值为proxy通过代理进行关联 可选值为 true此对象采用延迟加载并在变量第一次被访问时抓取、false此关联对象不采用延迟加载
    (8).update: 进行update操作时是否包含此字段
    (9).insert: 进行insert操作时是否包含此字段
    (10).not-found: 指定外键引用的数据不存在时如何让处理 默认值为exception产生异常 可选值为ignore对不存在的应用关联到null

    9.many-to-many 元素
    10.set 元素
    (1).name: 映射类属性的名字
    (2).table: 关联的目标数据库表
    (3).schema: 目标数据库表的schema名字
    (4).catalog: 目标数据库表的catalog名字
    (5).subselect: 定义一个子查询
    (6).sort: 设置排序的类型 默认值为 unsorted不排序 可选值为 natural自然排序、comparatorClass实现接口类作为排序算法 避免与order-by同时使用
    (7).lazy: 是否采用延迟加载
    (8).inverse: 用于标识双向关联中被动的一方 默认值为false
    (9).cascade: 设置级联操作时的级联类型
    (10).mutable: 标识被关联对象是否可以改变 默认值为true
    (11).order-by: 设置排序规则
    (12).where: 增加筛选条件
    (13).batch-size: 延迟加载时,一次读取数据的数量 默认值为1
    (14).fetch: 设置抓取数据的策略 可选值为 join外连接抓取、select序列选择抓取
    11.list 元素
    12.map 元素