一对多
一的hbm.xml配置
其中注意的地方在一对多执行保存方法的时候 每次在运行的时候 额外的列总会多生成,原因是在在set里面没有指定表格,设置下table就好了
<hibernate-mapping>
<class name="com.xiaonuo.domain.Customer" table="customer">
<!--建立类属性哪一个是主键-->
<id name="cust_id" column="cust_id" type="long">
<generator class="native" />
</id>
<!--普通属性和数据库进行关联-->
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_name" column="cust_name"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
<!--一对多-->
<set name="linkMans" cascade="save-update,delete-orphan" inverse="true">
<key column="id"></key>
<one-to-many class="com.xiaonuo.domain.LinkMan" />
</set>
</class>
</hibernate-mapping>
多的hbm.xml配置
<hibernate-mapping>
<class name="com.xiaonuo.domain.LinkMan" table="linkman">
<!--建立类属性哪一个是主键-->
<id name="link_id" column="link_id" type="long">
<generator class="native" />
</id>
<!--普通属性和数据库进行关联-->
<property name="link_mobile" />
<property name="link_gender" />
<property name="link_name" />
<property name="link_memo" />
<property name="link_email" />
<property name="link_qq" />
<property name="link_position" />
<property name="link_phone" />
<many-to-one name="customer" class="com.xiaonuo.domain.Customer" column="id" lazy="false"/>
</class>
</hibernate-mapping>
//测试代码
package com.xiaonuolen.test;
import com.untils.HibernateUtil;
import com.xiaonuo.domain.Customer;
import com.xiaonuo.domain.LinkMan;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
public class OneToMany {
@Test
public void Test(){
Session session = HibernateUtil.openSession();
session.beginTransaction();
Customer customer1 = new Customer();
customer1.setCust_name("customer1");
Customer customer2 = new Customer();
customer2.setCust_name("customer2");
Customer customer3 = new Customer();
customer3.setCust_name("customer3");
LinkMan linkMan1 = new LinkMan();
linkMan1.setLink_name("linkMan1");
LinkMan linkMan2 = new LinkMan();
linkMan2.setLink_name("linkMan2");
LinkMan linkMan3 = new LinkMan();
linkMan3.setLink_name("linkMan3");
/*配置关系*/
customer1.getLinkMans().add(linkMan1);
customer1.getLinkMans().add(linkMan2);
customer2.getLinkMans().add(linkMan3);
linkMan1.setCustomer(customer1);
linkMan2.setCustomer(customer1);
linkMan3.setCustomer(customer2);
session.save(customer1);
session.save(customer2);
session.save(customer3);
session.save(linkMan1);
session.save(linkMan2);
session.save(linkMan3);
session.getTransaction().commit();
}
@Test
public void select(){
Session currentSession = HibernateUtil.getCurrentSession();
currentSession.beginTransaction();
LinkMan linkMan = currentSession.get(LinkMan.class, 48L);
currentSession.getTransaction().commit();
System.out.println(linkMan.getCustomer().getCust_id());
currentSession.close();
}
@Test
public void delete(){
Session currentSession = HibernateUtil.getCurrentSession();
currentSession.beginTransaction();
Customer customer = currentSession.get(Customer.class, 3L);
currentSession.delete(customer);
currentSession.getTransaction().commit();
currentSession.close();
}
@Test
public void update(){
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
//更新
Customer customer = currentSession.get(Customer.class, 2L);
LinkMan linkMan = currentSession.get(LinkMan.class, 6L);
//关联
//双向维护
customer.getLinkMans().add(linkMan);
linkMan.setCustomer(customer);
transaction.commit();
currentSession.close();
}
}
lazy在查询的时候默认开启懒加载(lazy),从而查不出关联的类,关闭即可,查哪个关哪个。
inverse的作用在一对多或者多对多在双向维护的关系中关闭一方的维护权力,减少执行查询语句,多对多的情况下不改inverse会出现主键重复的错误。
cascade设置级联的操作。注释翻译是必须级联到关联目标的操作。默认情况下没有级联操作。
多对多
<hibernate-mapping>
<class name="com.xiaonuo.domain.Role" table="role">
<!--建立类属性哪一个是主键-->
<id name="role_id" column="role_id" type="long">
<generator class="native" />
</id>
<!--普通属性和数据库进行关联-->
<property name="role_memo" />
<property name="role_name" />
<!--对应的集合-->
<set name="user" inverse="true">
<!--对应外键的主键名称-->
<key column="role_id"></key>
<!--column对方对象所对应中间表的外键名称-->
<many-to-many class="com.xiaonuo.domain.Role" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
另一个的配置信息
<hibernate-mapping>
<class name="com.xiaonuo.domain.User" table="user">
<!--建立类属性哪一个是主键-->
<id name="user_id" column="user_id" type="long">
<generator class="native" />
</id>
<!--普通属性和数据库进行关联-->
<property name="user_code" />
<property name="user_name" />
<property name="user_password" />
<property name="user_state" />
<set name="role" cascade="save-update">
<!--对应外键的主键名称-->
<key column="user_id"></key>
<!--column对方对象所对应中间表的外键名称-->
<many-to-many class="com.xiaonuo.domain.Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
测试方法
package com.xiaonuolen.test;
import com.untils.HibernateUtil;
import com.xiaonuo.domain.Role;
import com.xiaonuo.domain.User;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import java.nio.file.attribute.UserPrincipalLookupService;
public class ManyToMany {
@Test
public void Test1(){
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user1 = new User();
user1.setUser_name("user1");
User user2 = new User();
user2.setUser_name("user2");
Role role1 = new Role();
role1.setRole_name("role1");
Role role2 = new Role();
role2.setRole_name("role2");
Role role3 = new Role();
role3.setRole_name("role3");
/**双向维护 要有一方放弃维护权力**/
role1.getUser().add(user1);
role2.getUser().add(user1);
role2.getUser().add(user2);
role3.getUser().add(user2);
user1.getRole().add(role1);
user1.getRole().add(role2);
user2.getRole().add(role2);
user2.getRole().add(role3);
currentSession.save(user1);
currentSession.save(user2);
transaction.commit();
currentSession.close();
}
@Test
public void Test2(){
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user1 = currentSession.get(User.class, 13L);
Role role1 = currentSession.get(Role.class, 13L);
Role role2 = currentSession.get(Role.class, 14L);
user1.getRole().remove(role1);
user1.getRole().add(role2);
currentSession.save(user1);
transaction.commit();
currentSession.close();
}
@Test
public void Test3(){
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
transaction.commit();
currentSession.close();
}
}