在项目中,原有的持久化操作时使用JPA进行的,通过注解多对一映射被映射成中间表和两个数据库表,其代码如下:
- importjavax.persistence.Column;
- importjavax.persistence.Entity;
- importjavax.persistence.GeneratedValue;
- importjavax.persistence.GenerationType;
- importjavax.persistence.Id;
- importjavax.persistence.NamedQueries;
- importjavax.persistence.NamedQuery;
- importjavax.persistence.Table;
- /**
- *产品实体类
- *@author李文锴
- */
- @Entity
- @Table(name="yunda_product")
- @NamedQueries({
- @NamedQuery(name="getProduct",query="SELECTpFROMOrderProductASp"),
- @NamedQuery(name="getProductByName",query="SELECTpFROMOrderProductASpWHEREp.name=:name")
- })
- publicclassOrderProductimplementsjava.io.Serializable{
- privatestaticfinallongserialVersionUID=1L;
- /**
- *货物id
- */
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- privateLongid;
- /**
- *货物名称
- */
- @Column(name="p_name",length=80,nullable=false)
- privateStringname;
- /**
- *货物类型
- */
- @Column(name="p_type",length=80,nullable=false)
- privateStringtype;
- /**
- *货物数量
- */
- @Column(name="p_quantity",nullable=false)
- privateintquantity;
- publicOrderProduct(){
- }
- publicOrderProduct(Stringname,Stringtype,intquantity){
- setName(name);
- setType(type);
- setQuantity(quantity);
- }
- publicLonggetId(){
- returnid;
- }
- publicvoidsetId(Longid){
- this.id=id;
- }
- publicStringgetName(){
- returnname;
- }
- publicvoidsetName(Stringname){
- this.name=name;
- }
- publicintgetQuantity(){
- returnquantity;
- }
- publicvoidsetQuantity(intquantity){
- this.quantity=quantity;
- }
- publicStringgetType(){
- returntype;
- }
- publicvoidsetType(Stringtype){
- this.type=type;
- }
- @Override
- publicbooleanequals(Objectobj){
- if(obj==null){
- returnfalse;
- }
- if(getClass()!=obj.getClass()){
- returnfalse;
- }
- finalOrderProductother=(OrderProduct)obj;
- if((this.name==null)?(other.name!=null):!this.name.equals(other.name)){
- returnfalse;
- }
- if((this.type==null)?(other.type!=null):!this.type.equals(other.type)){
- returnfalse;
- }
- if(this.quantity!=other.quantity){
- returnfalse;
- }
- returntrue;
- }
- @Override
- publicinthashCode(){
- inthash=7;
- hash=61*hash+(this.name!=null?this.name.hashCode():0);
- hash=61*hash+(this.type!=null?this.type.hashCode():0);
- hash=61*hash+this.quantity;
- returnhash;
- }
- }
- importjava.util.Date;
- importjava.util.Set;
- importjavax.persistence.CascadeType;
- importjavax.persistence.Column;
- importjavax.persistence.Entity;
- importjavax.persistence.GeneratedValue;
- importjavax.persistence.GenerationType;
- importjavax.persistence.Id;
- importjavax.persistence.JoinColumn;
- importjavax.persistence.JoinTable;
- importjavax.persistence.OneToMany;
- importjavax.persistence.Table;
- importjavax.persistence.Temporal;
- /**
- *存储订单实体类,其中和产品实体进行关联
- *@author李文锴
- */
- @Entity
- @Table(name="stock_order")
- publicclassStockOrderimplementsjava.io.Serializable{
- privatestaticfinallongserialVersionUID=1L;
- /**
- *订单id
- */
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- privateLongid;
- /**
- *客户编号
- */
- @Column(name="customer_no",length=20,nullable=false)
- privateStringcustomerNO;
- /**
- *客户名称
- */
- @Column(name="customer_name",length=80,nullable=false)
- privateStringcustomerName;
- /**
- *产品
- */
- @OneToMany(cascade=CascadeType.ALL)
- @JoinTable(name="stock_order_product",joinColumns={@JoinColumn(name="stock_order_id")},inverseJoinColumns={@JoinColumn(name="product_id")})
- privateSet<OrderProduct>prdoucts;
- /**
- *到达日期
- */
- @Column(name="arrival_date",nullable=false)
- @Temporal(javax.persistence.TemporalType.DATE)
- privateDatearrivalDate;
- publicStockOrder(){
- }
- publicStockOrder(StringcustomerNO,StringcustomerName,Set<OrderProduct>prdoucts,DatearrivalDate){
- setCustomerNO(customerNO);
- setCustomerName(customerName);
- setPrdoucts(prdoucts);
- setArrivalDate(arrivalDate);
- }
- publicDategetArrivalDate(){
- returnarrivalDate;
- }
- publicvoidsetArrivalDate(DatearrivalDate){
- this.arrivalDate=arrivalDate;
- }
- publicStringgetCustomerNO(){
- returncustomerNO;
- }
- publicvoidsetCustomerNO(StringcustomerNO){
- this.customerNO=customerNO;
- }
- publicLonggetId(){
- returnid;
- }
- publicvoidsetId(Longid){
- this.id=id;
- }
- publicSet<OrderProduct>getPrdoucts(){
- returnprdoucts;
- }
- publicvoidsetPrdoucts(Set<OrderProduct>prdoucts){
- this.prdoucts=prdoucts;
- }
- publicStringgetCustomerName(){
- returncustomerName;
- }
- publicvoidsetCustomerName(StringcustomerName){
- this.customerName=customerName;
- }
- @Override
- publicbooleanequals(Objectobj){
- if(obj==null){
- returnfalse;
- }
- if(getClass()!=obj.getClass()){
- returnfalse;
- }
- finalStockOrderother=(StockOrder)obj;
- if((this.customerNO==null)?(other.customerNO!=null):!this.customerNO.equals(other.customerNO)){
- returnfalse;
- }
- if((this.customerName==null)?(other.customerName!=null):!this.customerName.equals(other.customerName)){
- returnfalse;
- }
- if(this.prdoucts!=other.prdoucts&&(this.prdoucts==null||!this.prdoucts.equals(other.prdoucts))){
- returnfalse;
- }
- if(this.arrivalDate!=other.arrivalDate&&(this.arrivalDate==null||!this.arrivalDate.equals(other.arrivalDate))){
- returnfalse;
- }
- returntrue;
- }
- @Override
- publicinthashCode(){
- inthash=5;
- hash=59*hash+(this.customerNO!=null?this.customerNO.hashCode():0);
- hash=59*hash+(this.customerName!=null?this.customerName.hashCode():0);
- hash=59*hash+(this.prdoucts!=null?this.prdoucts.hashCode():0);
- hash=59*hash+(this.arrivalDate!=null?this.arrivalDate.hashCode():0);
- returnhash;
- }
- }
- importjava.util.Date;
- importjava.util.Set;
- importjavax.persistence.CascadeType;
- importjavax.persistence.Column;
- importjavax.persistence.Entity;
- importjavax.persistence.GeneratedValue;
- importjavax.persistence.GenerationType;
- importjavax.persistence.Id;
- importjavax.persistence.JoinColumn;
- importjavax.persistence.JoinTable;
- importjavax.persistence.OneToMany;
- importjavax.persistence.Table;
- importjavax.persistence.Temporal;
- /**
- *运输订单实体类,并于产品实体进行关联
- *@author李文锴
- */
- @Entity
- @Table(name="trans_order")
- publicclassTransOrderimplementsjava.io.Serializable{
- privatestaticfinallongserialVersionUID=1L;
- /**
- *订单id
- */
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- privateLongid;
- /**
- *客户编号
- */
- @Column(name="customer_no",length=20,nullable=false)
- privateStringcustomerNO;
- /**
- *客户名称
- */
- @Column(name="customer_name",length=80,nullable=false)
- privateStringcustomerName;
- /**
- *产品
- */
- @OneToMany(cascade=CascadeType.ALL)
- @JoinTable(name="trans_order_product",joinColumns={@JoinColumn(name="trans_order_id")},inverseJoinColumns={@JoinColumn(name="product_id")})
- privateSet<OrderProduct>prdoucts;
- /**
- *其实地址
- */
- @Column(name="start_address",length=80,nullable=false)
- privateStringstartAddress;
- /**
- *目的地址
- */
- @Column(name="end_address",length=80,nullable=false)
- privateStringendAddress;
- /**
- *运输日期
- */
- @Column(name="trans_date",nullable=false)
- @Temporal(javax.persistence.TemporalType.DATE)
- privateDatetransportationDate;
- publicTransOrder(){
- }
- publicTransOrder(StringcustomerNO,StringcustomerName,Set<OrderProduct>prdoucts,StringstartAddress,StringendAddress,DatetransportationDate){
- setCustomerNO(customerNO);
- setCustomerName(customerName);
- setPrdoucts(prdoucts);
- setStartAddress(startAddress);
- setEndAddress(endAddress);
- setTransportationDate(transportationDate);
- }
- publicDategetTransportationDate(){
- returntransportationDate;
- }
- publicvoidsetTransportationDate(DatetransportationDate){
- this.transportationDate=transportationDate;
- }
- publicStringgetCustomerNO(){
- returncustomerNO;
- }
- publicvoidsetCustomerNO(StringcustomerNO){
- this.customerNO=customerNO;
- }
- publicLonggetId(){
- returnid;
- }
- publicvoidsetId(Longid){
- this.id=id;
- }
- publicSet<OrderProduct>getPrdoucts(){
- returnprdoucts;
- }
- publicvoidsetPrdoucts(Set<OrderProduct>prdoucts){
- this.prdoucts=prdoucts;
- }
- publicStringgetCustomerName(){
- returncustomerName;
- }
- publicvoidsetCustomerName(StringcustomerName){
- this.customerName=customerName;
- }
- publicStringgetEndAddress(){
- returnendAddress;
- }
- publicvoidsetEndAddress(StringendAddress){
- this.endAddress=endAddress;
- }
- publicStringgetStartAddress(){
- returnstartAddress;
- }
- publicvoidsetStartAddress(StringstartAddress){
- this.startAddress=startAddress;
- }
- @Override
- publicbooleanequals(Objectobj){
- if(obj==null){
- returnfalse;
- }
- if(getClass()!=obj.getClass()){
- returnfalse;
- }
- finalTransOrderother=(TransOrder)obj;
- if((this.customerNO==null)?(other.customerNO!=null):!this.customerNO.equals(other.customerNO)){
- returnfalse;
- }
- if((this.customerName==null)?(other.customerName!=null):!this.customerName.equals(other.customerName)){
- returnfalse;
- }
- if(this.prdoucts!=other.prdoucts&&(this.prdoucts==null||!this.prdoucts.equals(other.prdoucts))){
- returnfalse;
- }
- if((this.startAddress==null)?(other.startAddress!=null):!this.startAddress.equals(other.startAddress)){
- returnfalse;
- }
- if((this.endAddress==null)?(other.endAddress!=null):!this.endAddress.equals(other.endAddress)){
- returnfalse;
- }
- if(this.transportationDate!=other.transportationDate&&(this.transportationDate==null||!this.transportationDate.equals(other.transportationDate))){
- returnfalse;
- }
- returntrue;
- }
- @Override
- publicinthashCode(){
- inthash=3;
- hash=79*hash+(this.customerNO!=null?this.customerNO.hashCode():0);
- hash=79*hash+(this.customerName!=null?this.customerName.hashCode():0);
- hash=79*hash+(this.prdoucts!=null?this.prdoucts.hashCode():0);
- hash=79*hash+(this.startAddress!=null?this.startAddress.hashCode():0);
- hash=79*hash+(this.endAddress!=null?this.endAddress.hashCode():0);
- hash=79*hash+(this.transportationDate!=null?this.transportationDate.hashCode():0);
- returnhash;
- }
- }
先要使用Hibernate对其进行映射,由于产生了中间表,所以它的配置文件有些不同,如下:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <classname="com.yunda.dao.domain.Product"table="yunda_product">
- <idname="id"type="long">
- <generatorclass="native"/>
- </id>
- <propertyname="name"column="p_name"type="string"length="80"not-null="true"/>
- <propertyname="type"column="p_type"type="string"length="80"not-null="true"/>
- <propertyname="quantity"column="p_quantity"type="integer"length="80"not-null="true"/>
- <!--使用join来配置多对一的连接,以table属性来表示连接表的多对一,连接表为stock_order_id-->
- <!--optional属性表示这是一个外连接,inverse属性可以出现在一端和多端,这里选择出现在多端,效果相同-->
- <jointable="stock_order_product"optional="true"inverse="true">
- <!--该key的字段为连接表中的字段,作为外键-->
- <keycolumn="product_id"/>
- <!--连接表中配置多对一,对应的字段为stock_order_id-->
- <many-to-onename="stockOrder"column="stock_order_id"not-null="true"/>
- </join>
- <!--使用join来配置多对一的连接,以table属性来表示连接表的多对一,连接表为trans_order_id-->
- <!--optional属性表示这是一个外连接,inverse属性可以出现在一端和多端,这里选择出现在多端,效果相同-->
- <jointable="trans_order_product"optional="true"inverse="true">
- <!--该key的字段为连接表中的字段,作为外键-->
- <keycolumn="product_id"/>
- <!--连接表中配置多对一,对应的字段为trans_order_id-->
- <many-to-onename="transOrder"column="trans_order_id"not-null="true"/>
- </join>
- </class>
- </hibernate-mapping>
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <classname="com.yunda.dao.domain.StockOrder"table="stock_order">
- <idname="id"type="long">
- <generatorclass="native"/>
- </id>
- <propertyname="customerNO"column="customer_no"type="string"length="20"not-null="true"/>
- <propertyname="customerName"column="customer_name"type="string"length="80"not-null="true"/>
- <propertyname="arrivalDate"column="arrival_date"type="date"not-null="true"/>
- <!--通过连接表的一端,因此需要table属性为stock_order_product-->
- <setname="prdoucts"cascade="all"table="stock_order_product"lazy="false">
- <!--该key的字段为连接表中的字段,作为外键-->
- <keycolumn="stock_order_id"/>
- <!--配置多对多-->
- <!--但是unique属性为true,表示product_id字段为不可重复,保证一对多关系-->
- <many-to-manyclass="com.yunda.dao.domain.Product"column="product_id"unique="true"/>
- </set>
- </class>
- </hibernate-mapping>
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <classname="com.yunda.dao.domain.TransOrder"table="trans_order">
- <idname="id"type="long">
- <generatorclass="native"/>
- </id>
- <propertyname="customerNO"column="customer_no"type="string"length="20"not-null="true"/>
- <propertyname="customerName"column="customer_name"type="string"length="80"not-null="true"/>
- <propertyname="startAddress"column="start_address"type="string"length="80"not-null="true"/>
- <propertyname="endAddress"column="end_address"type="string"length="80"not-null="true"/>
- <propertyname="transportationDate"column="trans_date"type="date"not-null="true"/>
- <!--通过连接表的一端,因此需要table属性为stock_order_product-->
- <setname="prdoucts"cascade="all"table="trans_order_product"lazy="false">
- <!--该key的字段为连接表中的字段,作为外键-->
- <keycolumn="trans_order_id"/>
- <!--配置多对多-->
- <!--但是unique属性为true,表示product_id字段为不可重复,保证一对多关系-->
- <many-to-manyclass="com.yunda.dao.domain.Product"column="product_id"unique="true"/>
- </set>
- </class>
- </hibernate-mapping>