数据库的设计及hibernate实体映射

以《商品案例数据库为例》

首先

商品案例数据库设计:

管理员表:

        id     :递增序列

        name  :管理员

        pass   :密码

客户表

        id     :递增序列

        name  :登录名称

        pass   :登录密码

        sex    : 性别        //enum

        email  :注册邮箱   

        rdate   :注册日期    //BeanUtils

        state   :是否被激活的状态  0 1

商品表

        id     :递增序列

        name  : 商品的名称

        type   : 商品的类型

        price   :商品的价格

订单表:

        Id         :递增序列

        number    :订单编号

  customerid  :客户名称

        odate      :订单时间

        state       :订单的状态 //已发货  未发货  0 1

        ostate      :确认订单是否订购             0 1

    订单明细表

        id

        goodid   :商品的名称

        num     :商品数量

        total     :商品的总价格

        ordersid  :订单

一张订单可以有多个商品,一个商品可以有多个订单

所以:订单表和商品表是多对多的关系

一个顾客可以有多个订单,一个订单只能属于一个顾客

所以:顾客表和订单表是一对多的关系

要实现Hibernate实体映射首先要导入hibernate所需要的包

接下来用hibernate的映射实现数据表的生成

首先先生成管理员表

代码如下:

public class Admin implements Serializable{

privatestaticfinallongserialVersionUID=1L;

privateintid;

privateStringname;

privateStringpass;

publicAdmin(){}

publicAdmin(Stringname,Stringpass){

this.name=name;

this.pass=pass;

}

省略Get,set方法

}

映射文件中的代码:

<hibernate-mapping>       <class name="cn.csdn.domain.Admin" table="admins" catalog="db">

             <id name="id">

             <generator class="native"/>

             </id>             <property name="name" type="string" length="30"/>

             <property name="pass" type="string" length="12"/>

       </class>

</hibernate-mapping>

接下来生成顾客表和订单表

       顾客表:顾客表和订单表是一对多的关系

public class Customer implements Serializable {

privatestaticfinallongserialVersionUID=1L;

privateintid;

privateStringname;

privateStringpass;

    private Sex sex; //enum

    private String email;    private Date rdate; //BeanUtils

    private int state;

privateSet<Orders>orders=newHashSet<Orders>();

publicCustomer(Stringname,Stringpass,Sexsex,Stringemail,

Daterdate,intstate,Set<Orders>orders){

this.name=name;

this.pass=pass;

this.sex=sex;

this.email=email;

this.rdate=rdate;

this.state=state;

this.orders=orders;

}

publicCustomer(){}

省略Get,set方法

}

映射文件中的代码:

  <class name="cn.csdn.domain.Customer" table="customers" catalog="db">

       <id name="id">

          <generator class="native"/>

       </id>       <property name="name" type="string" length="30" />

       <property name="pass" type="string" length="12" />

       <property name="sex" type="string" length="4" />

       <property name="email" type="string" length="30" />

       <property name="rdate" type="timestamp" />

       <property name="state" type="integer" />

     <set name="orders" table="orders">

           <key column="cid" />//cid是订单表的外键,顾客表的主键           <one-to-many class="cn.csdn.domain.Orders" />

     </set>

</class>

订单表:

顾客表和订单表是一对多的关系;

        订单表和商品表是多对多的关系,所以要加一个表,变成两一对多的实体映射

        订单表和订单明细表是一对多的关系,商品表和订单明细表是一对多的关系

所以就加了一个订单明细表

public class Orders implements Serializable{

privatestaticfinallongserialVersionUID=1L;

privateintid;

privateStringnumber;

privateCustomercustomer;

privateDateodate;

privateintstate;

privateintQstate;

    private Set<OrdersItem> ordersItem = new HashSet<OrdersItem>();

    public Orders() { }

publicOrders(intid,Stringnumber,Customercustomer,Dateodate,

intstate,intqstate,Set<OrdersItem>ordersItem){

this.id=id;

this.number=number;

this.customer=customer;

this.odate=odate;

this.state=state;

Qstate=qstate;

this.ordersItem=ordersItem;

    }

省略 Get,set方法

}

映射文件中的代码:

<class name="cn.csdn.domain.Orders" table="orders" catalog="db">

       <id name="id">

          <generator class="native"/>

       </id>       <property name="number" type="string" length="30"/>

 <many-to-one name="customer"

class="cn.csdn.domain.Customer" column="cid"/>

//订单表和顾客表是多对一的关系       <property name="odate" type="timestamp" />

       <property name="state" type="integer" />

       <property name="Qstate" type="integer" />

       <set name="ordersItem">

         <key column="oid"/>//订单明细表中的oid外键是订单表的主键         <one-to-many class="cn.csdn.domain.OrdersItem"/>

       //订单表和订单明细表是一对多的关系

</set>

    </class>

商品表:

一张订单可以有多个商品,一个商品可以有多个订单

所以:订单表和商品表是多对多的关系

订单明细表和商品表是多对一的关系

public class Goods implements Serializable {

privatestaticfinallongserialVersionUID=1L;

privateintid;

privateStringname;

privateStringtype;

privatedoubleprice;

privateSet<OrdersItem>ordersItem=newHashSet<OrdersItem>();

 

    public Goods() {}

publicGoods(Stringname,Stringtype,doubleprice,

Set<OrdersItem>ordersItem){

this.name=name;

this.type=type;

this.price=price;

this.ordersItem=ordersItem;

    }

省略 Get,set方法 

}映射文件中的代码:

<class name="cn.csdn.domain.Goods" table="goods" catalog="db">

       <id name="id">

          <generator class="native"/>

       </id>       <property name="name" type="string" length="50"/>

       <property name="type" type="string" length="40"/>

       <property name="price" type="double"/>

       <set name="ordersItem">

         <key column="gid"/>

         <one-to-many class="cn.csdn.domain.OrdersItem"/>

       </set>    </class>

订单明细表:

public class OrdersItem implements Serializable{

privatestaticfinallongserialVersionUID=1L;

privateintid;

privateGoodsgoods;

privateintnum;

privatedoubletotal;

privateOrdersorders;

publicOrdersItem(){}

publicOrdersItem(Goodsgoods,intnum,doubletotal,Ordersorders){

this.goods=goods;

this.num=num;

this.total=total;

this.orders=orders;

}

省略Get,set方法

}

映射文件中的代码:

<class name="cn.csdn.domain.OrdersItem" table="ordersItems"

       catalog="db">

       <id name="id">

           <generator class="native" />

       </id><many-to-one name="goods" class="cn.csdn.domain.Goods"

           column="gid" />

       <property name="num" type="integer" />

       <property name="total" type="double" />

       <many-to-one name="orders" class="cn.csdn.domain.Orders"

           column="oid" />

</class>

总结:一方主键做多方外键,一方用set集合多方用一方对象

相关推荐