现在根据customer和orders写一个复合主键的例子,两张表,如下所示
CREATE TABLE CUSTOMERS(ID INT AUTO_INCREMENT PRIMARY KEY,NAME VARCHAR(20), AGE INT )
CREATE TABLE ORDERS (ID INT,CUSTOMER_ID INT, NAME VARCHAR(20),PRICE DOUBLE,
CONSTRAINT PK_OR PRIMARY KEY(ID,CUSTOMER_ID),
CONSTRAINT FK_OR FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMERS(ID))
package entity;
import java.util.*;
public class Customer implements java.io.Serializable
{
private Long id;
private String name;
private Integer age;
private Set orders=new HashSet();
private void setId(Long id)
{
this.id=id;
}
public Long getId()
{
return this.id;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void setAge(Integer age)
{
this.age=age;
}
public Integer getAge()
{
return this.age;
}
public void setOrders(Set orders)
{
this.orders=orders;
}
public Set getOrders()
{
return this.orders;
}
}
package entity;
public class Order implements java.io.Serializable
{
private Long id;
private String name;
private Double price;
private Customer customer;
public Long cstid;
public void setCstid(Long cstid)
{
this.cstid=cstid;
}
public Long getCstid()
{
return this.cstid;
}
public void setId(Long id)
{
this.id=id;
}
public Long getId()
{
return this.id;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void setPrice(Double price)
{
this.price=price;
}
public Double getPrice()
{
return this.price;
}
public void setCustomer(Customer customer)
{
this.customer=customer;
}
public Customer getCustomer()
{
return this.customer;
}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Customer" table="CUSTOMERS">
<id name="id" column="ID">
<generator class="increment"/>
</id>
<property name="name" type="string" column="NAME"/>
<property name="age"/>
<set name="orders" cascade="delete" inverse="true" lazy="true">
<key column="CUSTOMER_ID"/>
<one-to-many class="Order"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Order" table="ORDERS">
<composite-id>
<key-property name="id" column="ID" type="long" />
<key-property name="cstid" column="CUSTOMER_ID" type="long"/>
</composite-id>
<property name="name"/>
<property name="price" type="double" />
<many-to-one name="customer" column="CUSTOMER_ID" class="Customer" insert="false" update="false"/>
</class>
</hibernate-mapping>
package util;
import org.hibernate.cfg.*;
import org.hibernate.*;
import entity.*;
public class HibernateUtil
{
private static SessionFactory sessionFactory;
static
{
try
{
Configuration config=new Configuration();
config.addClass(Customer.class).addClass(Order.class);
sessionFactory = config.buildSessionFactory();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory()
{
return sessionFactory;
}
}
hibernate.dialext=org.hibernate.dialext.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/PKTEST
hibernate.connection.username=root
hibernate.connection.password=
hibernate.show_sql=false
package service;
import util.*;
import entity.*;
import org.hibernate.*;
import java.util.*;
public class Test
{
public static void saveCustomer()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Customer c=new Customer();
c.setName("aaa");
c.setAge(new Integer(23));
session.save(c);
session.getTransaction().commit();
}
public static void saveOrder()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Order o=new Order();
o.setId(new Long(1));
o.setCstid(new Long(2));
o.setName("cpn");
o.setPrice(new Double(25));
session.save(o);
session.getTransaction().commit();
}
public static void listCstOrders()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Set ls=((Customer)session.load(Customer.class,new Long(1))).getOrders();
Iterator it=null;
for(it=ls.iterator();it.hasNext();)
{
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Order o=(Order)it.next();
System.out.println(o.getName());
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
}
session.getTransaction().commit();
}
public static void getCustomer()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Order or=new Order();
or.setId(new Long(1));
or.setCstid(new Long(2));
Order o=(Order)session.load(Order.class,or);
System.out.println("{{{{{{{{{{{{{{{{{{{");
System.out.println(o.getCustomer().getName());
System.out.println("}}}}}}}}}}}}}}}}}}}");
session.getTransaction().commit();
}
public static void main(String[] args)
{
//Test.getCustomer();
//Test.listCstOrders();
Test.saveCustomer();
//Test.saveOrder();
}
}
<project name="hibernate-tutorial" default="compile">
<property name="sourcedir" value="${basedir}/src"/>
<property name="targetdir" value="${basedir}/bin"/>
<property name="librarydir" value="${basedir}/lib"/>
<path id="libraries">
<fileset dir="${librarydir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="clean">
<delete dir="${targetdir}"/>
<mkdir dir="${targetdir}"/>
</target>
<target name="compile" depends="clean, copy-resources">
<javac srcdir="${sourcedir}"
destdir="${targetdir}"
classpathref="libraries"/>
</target>
<target name="copy-resources">
<copy todir="${targetdir}">
<fileset dir="${sourcedir}">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="run" depends="compile">
<java fork="true" classname="service.Test" classpathref="libraries">
<classpath path="${targetdir}"/>
</java>
</target>
</project>
分享到:
相关推荐
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射
hibernate 无主键表映射资源说明: 1. 简单Demo 2. Demo对应的sql语句 3. 对应博客文档
联合主键用Hibernate注解映射方式主要有三种: 第一、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主键...
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...
hibernate3 注释生成复合主键或者嵌入式主键的方法及实例
hibernate映射文件--主键生成策略[参考].pdf
NULL 博文链接:https://zhangzhi199129.iteye.com/blog/1663919
Hibernate继承映射+C3P0代码
hibernate复合主键设置,里面很全面的配置,可以拿到直接用
J2EE\Hibernate技术\Hibernate中对数据库复合主键的支持.pdf
NULL 博文链接:https://liuna718-163-com.iteye.com/blog/748089
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
如果使用Hibernate开发legacy的数据库应用,对于数据库表中有使用字符串作为主键或者使用复合主键情况,那么对于这些情况的影射档是比较麻烦的。该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM...
关于对Hibernate关联映射的一个总结,其中有各种映射的例子,详细用法 等
hibernate复合主键的实例,hibernate复合主键的实例。
关于hiberante主键的一对一的映射,单向的,实例
一个简单的复合主键的做关联类的例子
Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接表单向关联 Hibernate 多对多单向...
复合主键映射用起来比普通的增加主键字段要复杂,这里我们就来共同学习Java的Hibernate框架中复合主键映射的创建和使用教程,需要的朋友可以参考下