实体映射

本文介绍了一种将多个Java类映射到单一数据库表的方法,并详细展示了如何通过Hibernate框架实现这一目标。具体步骤包括创建表、定义Java类、修改POJO类及映射文件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个表对应几个类

假设要求设计一个表,表中保存一个人的信息。

表中应该包含以下内容

userid:身份证号

name:姓名

sex:性别

birthday:生日

address:住址

tel:电话

mobile:手机号



人:

编号 + 基本信息(不可变信息)+ 可变信息



根据类的设计原则:

三个类:

基本信息类

可变信息类

user类:编号,基本信息类,可变信息类



实体映射策略可以将多个类映射到一个表中,而且这多个类包含属性关系。



1、建立表
DROP TABLE user ;

CREATE TABLE user (

userid varchar(18) primary key ,

name varchar(20) not null,

sex varchar(2) not null,

birthday datetime not null,

address text ,

tel varchar(20) ,

mobile varchar(20)

);




2、生成表映射
在生成的pojouser类和映射文件的基础上进行修改:

(1)增加两个类:base和change
package org.liky.pojo;



import java.util.Date;



public class Base {



private String name;



private String sex;



private Date birthday;



public Date getBirthday() {

return birthday;

}



public void setBirthday(Date birthday) {

this.birthday = birthday;

}



public String getName() {

return name;

}



public void setName(String name) {

this.name = name;

}



public String getSex() {

return sex;

}



public void setSex(String sex) {

this.sex = sex;

}

}

package org.liky.pojo;



public class Change {

private String address;



private String tel;



private String mobile;



public String getAddress() {

return address;

}



public void setAddress(String address) {

this.address = address;

}



public String getMobile() {

return mobile;

}



public void setMobile(String mobile) {

this.mobile = mobile;

}



public String getTel() {

return tel;

}



public void setTel(String tel) {

this.tel = tel;

}

}






(2)修改pojo的user类
package org.liky.pojo;







public class User implements java.io.Serializable {



// Fields



private String userid;



private Base base;



private Change change;



// Constructors



public Base getBase() {

return base;

}



public void setBase(Base base) {

this.base = base;

}



public Change getChange() {

return change;

}



public void setChange(Change change) {

this.change = change;

}





public User() {

}



}


(3)修改映射文件
<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

<class name="org.liky.pojo.User" table="user" catalog="testdb">

<id name="userid" type="java.lang.String">

<column name="userid" length="18" />

<generator class="assigned" />

</id>

<!-- 在User类中,包含一个base属性,该属性为Base类型,这个属性中的子属性会与user表中的字段有关联 -->

<component name="base" class="org.liky.pojo.Base">

<property name="name" type="java.lang.String">

<column name="name" length="20" not-null="true" />

</property>

<property name="sex" type="java.lang.String">

<column name="sex" length="2" not-null="true" />

</property>

<property name="birthday" type="java.util.Date">

<column name="birthday" length="19" not-null="true" />

</property>

</component>

<!-- 同样,还包含一个change属性 -->

<component name="change" class="org.liky.pojo.Change">

<property name="address" type="java.lang.String">

<column name="address" length="65535" />

</property>

<property name="tel" type="java.lang.String">

<column name="tel" length="20" />

</property>

<property name="mobile" type="java.lang.String">

<column name="mobile" length="20" />

</property>

</component>

</class>

</hibernate-mapping>


3、编写后台代码
基本不变,只是需要注意:

对于参数的处理,如果该参数不在User对象中,需要通过其他属性继续.出来

public List<User> findAll(int cp, int ls) throws Exception {

// TODO Auto-generated method stub

String hql = "FROM User AS u WHERE u.base.name LIKE ?" ;

Query q= this.instance.getConnection().createQuery(hql);

q.setString(0, "%L%");

// 分页

q.setFirstResult((cp - 1) * ls);

q.setMaxResults(ls);

List all = q.list();



return all;

}


4、测试使用
UserDAO userdao = DAOFactory.getTestDAOInstance();



// 插入数据

// User user = new User();

// user.setUserid("123456789123456789");

// user.setBase(new Base());

//

// user.getBase().setName("MLDN");

// user.getBase().setSex("男");

// user.getBase().setBirthday(new Date());

//

// user.setChange(new Change());

// user.getChange().setAddress("MLDN.cn");

// user.getChange().setTel("51283346");

// user.getChange().setMobile("62350411");

//

// try {

// userdao.doCreate(user);

// } catch (Exception e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }

try {

User user = userdao.findById("123456789123456789");

System.out.println(user.getBase().getName() + " --> " +user.getChange().getMobile());

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}


可以发现数据会直接通过User中的base和change进行操作处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值