微网站怎么做的好名字,怎么做优化网站排名,赣州seo外包怎么收费,扁平化网站特效数据库关系 多对多#xff1a;通过第三张表来建立关系 第三张表至少包含两个字段作为外键且字段是其他两张表的主键 Hibernate一对多的操作 #xff08;1#xff09;一对多映射配置 步骤: 首先创建两个存在一对多关系的实体类两个实体类需要建立一对多的关系#xff1a;在多…数据库关系 多对多通过第三张表来建立关系 第三张表至少包含两个字段作为外键且字段是其他两张表的主键 Hibernate一对多的操作 1一对多映射配置 步骤: 首先创建两个存在一对多关系的实体类两个实体类需要建立一对多的关系在多的一方使用一的一方的对象表示所属一的类在一的一方使用Set集合表示全部属于一的多的实体类Hibernate中规定必须使用set集合来表示属于一的多的实体类Set的特点是无顺序、不重复建立两个实体类的映射表【配置文件】 public class Contacter {private Integer lid;private String lName;private String lPhone;private Client lClient; //在多的一方使用一的一方的实体类建立关系public class Client {private Integer cid;private String cName;private String cLevel;//Hibernate要求在多的里面使用set表示不使用list//Set是无序的不可重复的集合private SetContacter belongContecter new HashSetContacter(); //在多的一方使用Set集合包含属于一的一方的多的实体类建立关系 配置文件【一对多中一的一方】 ?xml version1.0 encodingUTF-8?
!-- 引入XML dtd 约束 --
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
hibernate-mappingclass nametech.youngs.entity.Client tablet_clientid namecid columncidgenerator classnative/generator/idproperty namecName columncName/propertyproperty namecLevel columncLevel/property!-- 使用set标签表示所有的多【联系人】 param name 在实体类中表示多的set集合的属性名--set namebelongContecter!-- 一对多建表 要有外键 hibernate规定双方都要配置外键 --!-- param column 外键的名称 --key columnfk_cl/key!-- 使用one-to-many表示一对多关系中 一的那一方 --!-- param class 一对多的多的实体类的全路径 --one-to-many classtech.youngs.entity.Contacter//set/class
/hibernate-mapping 配置文件【一对多中多的一方】 ?xml version1.0 encodingUTF-8?
!-- 引入XML dtd 约束 --
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
hibernate-mappingclass nametech.youngs.entity.Contacter tablet_contacterid namelid columnlidgenerator classnative/generator/idproperty namelName columnlName/propertyproperty namelPhone columnlPhone/property!-- 表示一对多 多所属的一 --!-- param name 在实体类中表示所属的一的实体类的属性名 --!-- param class 一对多 多所属的一的实体类的全路径 --!-- param column 外键的名称 与一的配置文件中定义的相同 --many-to-one namelClient classtech.youngs.entity.Client columnfk_cl/many-to-one/class
/hibernate-mapping 2一对多级联操作 包括级联保存和级联删除 级联保存创建一个客户及多个联系人级联删除删除客户以及其联系人传统的做法需要删除所有联系人后才能删除客户级联保存第一种方式 //第一步 创建客户和联系人对象Client client new Client();Contacter contacter new Contacter();client.setcName(Baidu);client.setcLevel(vip);contacter.setlName(Lucy);contacter.setlPhone(15191082682);//第二步 体现出两个实体类的一对多关系//把联系人对象放到客户的Set集合里面去client.getBelongContecter().add(contacter);//把客户对象方法放到联系人中去contacter.setlClient(client);//第三步 保存到数据库中session.save(client);session.save(contacter); 级联保存第二种方法 第一步在客户实体类的映射配置代码中的set中添加cascade属性 cascadesave-update set namebelongContecter cascadesave-update!-- 一对多建表 要有外键 hibernate规定双方都要配置外键 --!-- param column 外键的名称 --key columnfk_cl/key!-- 使用one-to-many表示一对多关系中 一的那一方 --!-- param class 一对多的多的实体类的全路径 --one-to-many classtech.youngs.entity.Contacter//set 第二步 只需要将联系人放到客户里面就可以了最终只保存客户就行了。 //第二步 把联系人对象放到客户的Set集合里面去client.getBelongContecter().add(contacter);//第三步 保存到数据库中session.save(client); 级联删除操作 第一步:在一对多的一的映射配置文件中的set标签的cascade属性设置为delete即可 cascade设置多属性属性和属性之间用逗号隔开 第二步直接删除即可 Client client session.get(Client.class, 1);
session.delete(client); Hibernate级联删除的SQL执行过程 Hibernate: updatet_contacter setfk_clnull wherefk_cl?
Hibernate: delete fromt_contacter wherelid?
Hibernate: delete fromt_client wherecid?一对多的修改 业务需求 将A公司的联系人lucy调整到B公司的联系人 //根据id查出调出员工和调入部门Client client session.get(Client.class, 1);Contacter contacter session.get(Contacter.class, 2);//持久态实体类 直接修改客户就行了//持久态可以自动更新数据库client.getBelongContecter().add(contacter);contacter.setlClient(client);注意由于在一对多的映射文件中外键由双方维护在修改的时候会重复修改外键。 解决方案在一对多的关系里可以让一的一方放弃对外键的维护。 实现方法在放弃外键维护的映射文件中进行配置在set标签上使用inverse属性设置为true放弃关系维护。 set namebelongContecter cascadesave-update,delete inversetrue Hibernate多对多的操作 多对多映射配置重要常用复杂 ?xml version1.0 encodingUTF-8?
!-- 引入XML dtd 约束 --
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
hibernate-mappingclass nametech.youngs.entity.User tablet_userid nameuid columnuidgenerator classnative/generator/idproperty nameusername columnusername/property!-- 使用set标签表示所有的多【联系人】 param name 在实体类中表示多的set集合的属性名param table 第三张表的名称--set nameroleSet tableuser_role cascadesave-update!-- param column 配置的是当前的映射文件在第三张表中的外键的名称 --key columnuser_id/key!-- 使用many-to-many表示多对多关系 --!-- param class 一对多的多的实体类的全路径 --!-- param colunmn 表示的是多对多另外的多的第三张表的外键多的名称 --many-to-many classtech.youngs.entity.Role columnrole_id/many-to-many/set/class
/hibernate-mapping ?xml version1.0 encodingUTF-8?
!-- 引入XML dtd 约束 --
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
hibernate-mappingclass nametech.youngs.entity.Role tablet_roleid namerid columnridgenerator classnative/generator/idproperty nameroleName columnroleName/property!-- 使用set标签表示所有的多【联系人】 param name 在实体类中表示多的set集合的属性名--set nameuserSet tableuser_role!-- param column 第三张表中这个实体类的外键的名称 --key columnrole_id/key!-- param class 多对多的另一个多的实体类的全路径 --many-to-many classtech.youngs.entity.User columnuser_id/many-to-many/set/class
/hibernate-mapping 同样的两个实体类需要建立关系通过Set集合来建立。 多对多的增加与一对多几乎相同。 多对多中一般不使用级联删除 因为级联删除会将删除条目的外键的条目一并删除在实际开发中如果要删除某个用户的某个角色我们并不希望其将角色也删除只需要将该用户的该角色去掉即可。如果级联删除的话会将角色一并删除其他拥有此角色的用户一并被删除这是不现实的。 通过维护第三张表来表更多对多关系重要常用 让某个角色拥有某个角色在第三张表中增加uid和rid的对应关系即可即增加User中role set的对象 实现代码 User user session.get(User.class, 1);Role role session.get(Role.class, 2);user.getRoleSet().add(role); 同理让某个角色失去某个角色移除User中role set中的角色即可 实现代码 User user session.get(User.class, 1);Role role session.get(Role.class, 2);user.getRoleSet().remove(role); 转载于:https://www.cnblogs.com/youngs/p/6550160.html