您的位置:首页 > 其它

hibernate_day04_02_对象导航查询和oid查询

2017-11-27 12:08 441 查看
02_对象导航查询和oid查询

关键代码:

//根据cid = 4查询客户,再查询这个客户里面所有的联系人
Customer customer = session.get(Customer.class, 4);
//再查询这个客户里面的所有联系人
//直接得到客户里面联系人的set集合
Set<LinkMan> linkMan = customer.getSetLinkMan();
System.out.println(linkMan.size());

数据库:
/*
Navicat MySQL Data Transfer

Source Server : *.36.138_3306
Source Server Version : 50558
Source Host : *.36.138:3306
Source Database : hibernate_day03

Target Server Type : MYSQL
Target Server Version : 50558
File Encoding : 65001

Date: 2017-11-27 11:59:51
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `t_customer`
-- ----------------------------
DROP TABLE IF EXISTS `t_customer`;
CREATE TABLE `t_customer` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`custName` varchar(255) DEFAULT NULL,
`custLevel` varchar(255) DEFAULT NULL,
`custSource` varchar(255) DEFAULT NULL,
`custPhone` varchar(255) DEFAULT NULL,
`custMobile` varchar(255) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_customer
-- ----------------------------
INSERT INTO `t_customer` VALUES ('1', '传智播客', 'vip', '网络', '110', '999');
INSERT INTO `t_customer` VALUES ('4', '迅雷', '普通客户', '网络', '110', '999');

-- ----------------------------
-- Table structure for `t_linkman`
-- ----------------------------
DROP TABLE IF EXISTS `t_linkman`;
CREATE TABLE `t_linkman` (
`lkm_id` int(11) NOT NULL AUTO_INCREMENT,
`lkm_name` varchar(255) DEFAULT NULL,
`lkm_gender` varchar(255) DEFAULT NULL,
`lkm_phone` varchar(255) DEFAULT NULL,
`clid` int(11) DEFAULT NULL,
PRIMARY KEY (`lkm_id`),
KEY `FKjtgu0oocf35ij4fmulu123vwk` (`clid`),
CONSTRAINT `FKjtgu0oocf35ij4fmulu123vwk` FOREIGN KEY (`clid`) REFERENCES `t_customer` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_linkman
-- ----------------------------
INSERT INTO `t_linkman` VALUES ('1', 'lucy', '男', '911', '4');
INSERT INTO `t_linkman` VALUES ('3', '小雷111', '男', '911', '4');


项目代码结构:



详细代码:com.hlg.entity.Customer

package com.hlg.entity;

import java.util.HashSet;
import java.util.Set;

public class Customer {

//客户id
private Integer cid;
//客户名称
private String custName;
//客户级别
private String custLevel;
//客户来源
private String custSource;
//联系电话
private String custPhone;
//手机
private String custMobile;

//在客户实体类里面表示多个联系人,一个客户有多个联系人
//hibernate要求使用集合表示多的数据,使用set集合
private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();

public Integer getCid() {
return cid;
}

public void setCid(Integer cid) {
this.cid = cid;
}

public String getCustName() {
return custName;
}

public void setCustName(String custName) {
this.custName = custName;
}

public String getCustLevel() {
return custLevel;
}

public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
}

public String getCustSource() {
return custSource;
}

public void setCustSource(String custSource) {
this.custSource = custSource;
}

public String getCustPhone() {
return custPhone;
}

public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}

public String getCustMobile() {
return custMobile;
}

public void setCustMobile(String custMobile) {
this.custMobile = custMobile;
}

public Set<LinkMan> getSetLinkMan() {
return setLinkMan;
}

public void setSetLinkMan(Set<LinkMan> setLinkMan) {
this.setLinkMan = setLinkMan;
}

}


实体类:com.hlg.entity.Customer对应的配置文件
<?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>
<!-- 1 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="com.hlg.entity.Customer" table="t_customer">
<id name="cid" column="cid">
<generator class="native"></generator>
</id>
<property name="custName" column="custName"></property>
<property name="custLevel" column="custLevel"></property>
<property name="custSource" column="custSource"></property>
<property name="custPhone" column="custPhone"></property>
<property name="custMobile" column="custMobile"></property>

<!-- 在客户映射文件中,表示所有联系人
使用set标签表示所有联系人
set标签里面有name属性:
属性值写在客户实体类里面表示联系人的set集合名称

inverse属性默认值:false不放弃关系维护
true表示放弃关系维护
-->
<set name="setLinkMan" cascade="save-update,delete" inverse="true">
<!-- 一对多建表,有外键
hibernate机制:双向维护外键,在一和多那一方都配置外键
column属性值:外键名称
-->
<key column="clid"></key>
<!-- 客户所有的联系人,class里面写联系人实体类全路径 -->
<one-to-many class="com.hlg.entity.LinkMan"/>
</set>
</class>
</hibernate-mapping>

实体类:com.hlg.entity.LinkMan
package com.hlg.entity;

public class LinkMan {

private Integer lkm_id; // 联系人编号(主键)
private String lkm_name;// 联系人姓名
private String lkm_gender;// 联系人性别
private String lkm_phone;// 联系人办公电话

// 在联系人实体类里面表示所属客户,一个联系人只能属于一个客户
private Customer customer;

public Integer getLkm_id() {
return lkm_id;
}

public void setLkm_id(Integer lkm_id) {
this.lkm_id = lkm_id;
}

public String getLkm_name() {
return lkm_name;
}

public void setLkm_name(String lkm_name) {
this.lkm_name = lkm_name;
}

public String getLkm_gender() {
return lkm_gender;
}

public void setLkm_gender(String lkm_gender) {
this.lkm_gender = lkm_gender;
}

public String getLkm_phone() {
return lkm_phone;
}

public void setLkm_phone(String lkm_phone) {
this.lkm_phone = lkm_phone;
}

public Customer getCustomer() {
return customer;
}

public void setCustomer(Customer customer) {
this.customer = customer;
}

}


实体类:com.hlg.entity.LinkMan 对应的配置文件
<?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>
<!-- 1 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="com.hlg.entity.LinkMan" table="t_linkman">
<id name="lkm_id" column="lkm_id">
<generator class="native"></generator>
</id>
<property name="lkm_name" column="lkm_name"></property>
<property name="lkm_gender" column="lkm_gender"></property>
<property name="lkm_phone" column="lkm_phone"></property>

<!-- 表示联系人所属客户
name属性:因为在联系人实体类使用customer对象表示,写customer名称
class属性:customer全路径
column属性:外键名称
-->
<many-to-one name="customer" class="com.hlg.entity.Customer" column="clid"></many-to-one>
</class>
</hibernate-mapping>

核心配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<!-- 第一部分:配置数据库信息 必须 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://*.36.138:3306/hibernate_day03?userUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">*</property>

<!-- 第二部分:配置hibernate信息 可选的 -->
<!-- 输出底层 sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层 sql语句的格式 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate 创建表,需要配置之后
update:如果已经有表,就更新;如果没有,创建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 第三部分 :把映射文件放到核心配置文件中 必须 -->
<mapping resource="com/hlg/entity/Customer.hbm.xml"/>
<mapping resource="com/hlg/entity/LinkMan.hbm.xml"/>

</session-factory>

</hibernate-configuration>


测试类:com.hlg.hibernatetest.HibernateDemo
package com.hlg.hibernatetest;

import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

import com.hlg.entity.Customer;
import com.hlg.entity.LinkMan;
import com.hlg.utils.HibernateUtils;

public class HibernateDemo {

@Test
public void testSelect1(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;

try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();

//根据cid = 4查询客户,再查询这个客户里面所有的联系人
Customer customer = session.get(Customer.class, 4);
//再查询这个客户里面的所有联系人
//直接得到客户里面联系人的set集合
Set<LinkMan> linkMan = customer.getSetLinkMan();
System.out.println(linkMan.size());

tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
session.close();
sessionFactory.close();
}

}
}


OID查询

1 根据id查询记录

(1)调用session里面的get方法实现

//根据cid = 4查询客户,再查询这个客户里面所有的联系人
Customer customer = session.get(Customer.class, 4);

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐