标签:hibernate struts2 web java 应用
关于多对多关系
数据库:在使用多对多的关系时,我们可以使用复合主键。也可以不使用,直接引入外键同样可以实现。
在数据库中使用多对多关系时,需要一个中间表。
多对多关系中的数据库结构如下:
表:Orders
字段:orderid(主键)、。。。。
表:Users
字段:usersid(主键),。。。。
中间表: cy_order_user
字段:cy_order_user主键id
外键:cy_orderid(引入Orders表)
外键:cy_usersid(引入Users表)
注意:中间表的外键是需要在实体类对应的配置文件中应用的。所以为了区分,在这里给外键命名时没有用orderid,而是使用cy_orderid。
当使用Myeclipse反转生成对应的实体类时,这时会生成中间的的实体类。而在Myeclipse中配置多对多关系时,并不需要中间表的信息。
所以,将中间表的实体类及配置文件删除。还需要在hibernate.cfg.xml中删除其对应的路径。然后这时需要修改Orders类和Users类中的Set集合的变量名。
因为反转生成的实体类对应关系是针对中间表的,所以需要修改实体类中的Set集合变量。
例如在Orders类中将Set集合的变量名改为user
那接下来还需要在Orders类对应的配置文件中设置其相关属性如下:
<set name="user" inverse="true" table="cy_order_user">
<key>
<column name="ordersid" />
</key>
<many-to-many class="com.jzlg.po.Users" column="cy_usersid" />
</set>
针对如上属性需要修改的如下:
<set name="Set变量名" inverse="true" table="中间表表名">
<key>
<column name="ordersid" />
</key>
<many-to-many class="与之多对多关系的类(包名.类名)" column="中间表引入对应的外键名" />
</set>
需要注意的是:每个对应的实体po类的映射文件中配置的属性并不是必须的。例如:数据库中可能一张表中有50个字段,但是
其反向生成实体类的映射文件中并不一定需要配置50个属性。可以根据自身的需要进行配置。也就是说一张表50个字段,在其
对应的映射文件也可能就只有5个属性。可以根据自身的需要手动添加或者删除,但是如果不存在这个属性。在进行添加时,数据库这时
则为null。如果查询则也为null。所以在配置时需要根据自身的需要手动添加或者删除。
当我们在数据库中定义了一个默认字段时,这时我们需要在相应的配置文件中配置dynamic-insert="true"如下:
<class name="com.jzlg.po.Users" table="Users" schema="dbo" catalog="shopdbone" dynamic-insert="true">
createSQLQuery与createQuery的区别 :
hibernate 中createQuery与createSQLQuery两者区别是:
前者用的hql语句进行查询,后者可以用sql语句查询
前者以hibernate生成的Bean为对象装入list返回
后者则是以对象数组进行存储
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
突然发现createSQLQuery有这样一个方法可以直接转换对象
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。
Hibernate中的分页语句可以这么写
session = HibernateUtils.getSession();
session.beginTransaction();
Query query = session.createQuery("from User");
query.setFirstResult(0);//从第一条记录开始
query.setMaxResults(4);//取出四条记录
List userList = query.list();
标签:hibernate struts2 web java 应用
原文地址:http://blog.csdn.net/xiang462042190/article/details/40921909