`
nanshannan0106
  • 浏览: 11679 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate复合主键作外键该怎么样配置

阅读更多

数据库建表如下:

drop database choose ;
create database choose ;
use choose;
--student
create table student(
    sId char(10) not null primary key,
 sName char(20) not null,
 sPwd char(20) not null
);

create unique index PK_student on student(sId);
--course
create table course(
    coId char(10) not null primary key,
 coName char(20) not null,
 credit float(53) not null
);

create unique index PK_course on course(coId);
--chooseCourse
create table chooseCourse(
 coId char(10) not null,
 sId char(10) not null,
 grade float(53),
 primary key(coId,sId),
 foreign key (coId) references course(coId),
 foreign key (sId) references student(sId)
);

insert into student values('0621','jj,'668668668');

insert into course values('0001','汇编原理','3.0');

insert into course values('0002','网页设计与制作','2.0');

insert into chooseCourse values('0001','0621',76.7);

insert into chooseCourse values('0002','0621',80.0);

 

 

Student.java

package vo;

import java.io.Serializable;
import java.util.Set;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

public class Student implements Serializable 
{
	private String sId;
	private String sName;
	private String sPwd;
	private Set chooseCourses;

	public Student() {
	}

	public String getsname() {
		return sName;
	}

	public void setsname(String name) {
		sName = name;
	}

	public String getspwd() {
		return sPwd;
	}

	public void setspwd(String pwd) {
		sPwd = pwd;
	}

	public String getsId() {
		return sId;
	}
	public void setsId(String id) {
		sId = id;
	}

	public Set getChooseCourses() {
		return chooseCourses;
	}

	public void setChooseCourses(Set chooseCourses) {
		this.chooseCourses = chooseCourses;
	}
	
	public boolean equals(Object obj) {
    	if (this == obj) {
			return true;
		}
		if (!(obj instanceof ChooseCourse)) {
			return false;
		}
		Student student = (Student) obj;
		return new EqualsBuilder().append(this.sId, student.getsId()).append(this.sName,
				student.getsname()).append(this.sPwd, student.getspwd()).append(this.chooseCourses, student.getChooseCourses()).isEquals();
	}

	public int hashCode() {
    	return new HashCodeBuilder().append(this.sId).append(
    			this.sName).append(this.sPwd).append(this.chooseCourses).toHashCode();
	}
}

 Student.hbm.xml

<?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="vo.Student" table="student" catalog="choose">
        <id name="sId" type="java.lang.String">
            <column name="sId" length="10" />
            <generator class="assigned" />
        </id>
        <property name="sname" type="java.lang.String">
            <column name="sName" length="20" not-null="true" />
        </property>
        <property name="spwd" type="java.lang.String">
            <column name="sPwd" length="20" not-null="true" />
        </property>
        <set name="chooseCourses" inverse="true">
            <key>
                <column name="sId" length="10" not-null="true" />
            </key>
            <one-to-many class="vo.ChooseCourse" />
        </set>
    </class>
</hibernate-mapping>

 Course.java

package vo;

import java.io.Serializable;
import java.util.Set;

public class Course implements Serializable 
{
	private String coId;
	private String coName;
	private double credit;
	private Set chooseCourse;

	public Course() {

	}

	public String getCoId() {
		return coId;
	}

	public void setCoId(String coId) {
		this.coId = coId;
	}

	public String getCoName() {
		return coName;
	}

	public void setCoName(String coName) {
		this.coName = coName;
	}

	public double getCredit() {
		return credit;
	}

	public void setCredit(double credit) {
		this.credit = credit;
	}

	public Set getChooseCourse() {
		return chooseCourse;
	}

	public void setChooseCourse(Set chooseCourse) {
		this.chooseCourse = chooseCourse;
	}


}

 

Course.hbm.xml

<?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="vo.Course" table="course" catalog="choose">
        <id name="coId" type="java.lang.String">
            <column name="coId" length="10" />
            <generator class="assigned" />
        </id>
        <property name="coName" type="java.lang.String">
            <column name="coName" length="20" not-null="true" />
        </property>
        <property name="credit" type="java.lang.Double">
            <column name="credit" precision="22" scale="0" not-null="true" />
        </property>
        <set name="chooseCourse" inverse="true">
            <key>
                <column name="coId" length="10" not-null="true" />
            </key>
            <one-to-many class="vo.ChooseCourse" />
        </set>
    </class>
</hibernate-mapping>

 ChooseCourse.java

package vo;

import java.io.Serializable;

public class ChooseCourse implements Serializable
{
	private ccPK ccpk;
	private double grade;
	public ChooseCourse()
	{
	}
	public double getGrade() {
		return grade;
	}
	public void setGrade(double grade) {
		this.grade = grade;
	}
	public ccPK getCcpk() {
		return ccpk;
	}
	public void setCcpk(ccPK ccpk) {
		this.ccpk = ccpk;
	}
}

 ChooseCourse.hbm.xml

<?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="vo.ChooseCourse" table="choosecourse" catalog="choose">
        <composite-id name="ccpk" class="vo.ccPK">
            <key-many-to-one name="course" class="vo.Course">
                <column name="coId" length="10" />
            </key-many-to-one>
            <key-many-to-one name="student" class="vo.Student">
                <column name="sId" length="10" />
            </key-many-to-one>
        </composite-id>
        <property name="grade" type="java.lang.Double">
            <column name="grade" precision="22" scale="0" />
        </property>
    </class>
</hibernate-mapping>

 最终测试类Test.java:

package test;

import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import vo.ChooseCourse;
import vo.Course;
import vo.Student;
import vo.ccPK;

public class Test
{
	public static void main(String[] args)
	{
		Session session = util.HibernateSessionFactory.getSession();
		Transaction tran = session.beginTransaction();
		Student stu = (Student)session.get(Student.class, "0621");		
		Set set = stu.getChooseCourses() ;
		Iterator ite = set.iterator();//这里出错了!是为何?是配置错误还是测试类有问题?
		while(ite.hasNext()){
			ChooseCourse ccc = (ChooseCourse)ite.next();
			System.out.println(ccc.getGrade());
		}
	}
}

 

最后测试类出问题了,请高手看一下,是我的配置错误还是测试类有问题?

谢谢!

 

分享到:
评论
1 楼 66605127 2008-07-28  
楼主怎么解决的

相关推荐

    hibernate复合主键配置和使用

    《Hibernate复合主键配置与使用详解》 在Java开发中,Hibernate作为一款强大的ORM框架,大大简化了数据库操作。然而,当我们面临复杂的数据表结构,尤其是涉及到复合主键时,如何在Hibernate中进行配置和使用就显得...

    演示怎样在Hibernate中使用复合主键

    该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM表的PK(ITEM_ID)是字符串,而CATEGORY_ITEM使用复合主键(CATEGORY_ID, ITEM_ID),FK是ITEM_ID字段。那么,我们这里的解决方案是使用uuid.hex...

    Hibernate学习笔记

    复合主键关联映射则是处理具有多个字段作为主键的表与对象之间的映射。 通过理解这些知识点,开发者可以更有效地利用Hibernate框架来开发复杂的企业级应用,处理数据持久化以及对象和关系数据库之间的映射。...

    hibernate 最常见的主建配置

    ### Hibernate最常见的主键配置 ...这些配置方式涵盖了单主键、复合主键以及与外键结合的多种情况,能够满足大部分实际应用中的需求。在实际开发过程中,根据业务场景选择合适的配置方式是非常重要的。

    Hibernate注解和xml配置介绍

    双主键的配置在Hibernate中稍微复杂一些,因为需要使用元素来定义复合主键。在双主键且有外键的情况下,可以嵌套使用和元素来定义复合主键和对应的外键关系。对于双主键中的两个主键都被作为外键使用的情况,可以在...

    Java代码生成工具新版

    支持自增主键,复合主键,外键关联。 生成Hibernate POJO类,Dao类,Service类,Action类。 生成保存,删除,修改,批量保存,批量修改,批量删除,按条件查询,分页查询等功能。 生成各大主流框架配置文件及JSP页面...

    Java代码生成工具(傻瓜式操作无需教程的代码生成工具) v2.0.zip

    支持自增主键,复合主键,外键关联。  生成hibernate pojo类,dao类,service类,action类。  生成保存,删除,修改,批量保存,批量修改,批量删除,按条件查询,分页查询等功能。  生成各大主流框架配置文件...

    Hibernate_关联关系映射配置

    `@EmbeddedId`用于指定实体的主键类,而`@Embeddable`则用于声明这个类为复合主键类。 六、延迟加载(Lazy Loading) Hibernate提供了延迟加载机制,可以按需加载关联对象,以提高性能。默认情况下,`@ManyToOne`...

    Hibernate3.1_学习源码

    04 04Hibernate_Composite : 复合主键的使用,在开发中很少用到,一般良好的设计都会为一个表添加一个自动增长的主键标识列。其中重点配置方法和Hibernate中普遍采用的方法链编程的使用。还需注意可以将组合主键构建...

    hibernate3 帮助文档CHM

    13. **其他高级特性**:如级联操作、联合主键、复合主键、外键约束、乐观锁和悲观锁等。 综上所述,《Hibernate3 帮助文档 CHM》是Java开发者不可或缺的参考资料,无论你是初学者还是经验丰富的开发者,都可以从中...

    hibernate注解详解说明

    #### 映射复合主键与外键 - `@EmbeddedId` 和 `@Embeddable`:用于创建复合主键,将多个字段组合成一个主键。 - `@ManyToOne` 和 `@OneToOne` 可以配合 `@MapsId` 将外键作为实体的一部分。 #### 映射二级表...

    Hibernate Annotations 中文文档

    2.2.6. 映射复合主键与外键 2.2.7. 映射二级表(secondary tables) 2.3. 映射查询 2.3.1. 映射EJBQL/HQL查询 2.3.2. 映射本地化查询 2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4.3. 属性 2.4...

    hibernate教程

    - **映射复合主键与外键**: - 复合主键可以通过`@EmbeddedId`和自定义的复合主键类来实现。 - **映射二级表**: - 使用`@SecondaryTables`和`@SecondaryTable`来指定额外的表。 #### 四、Hibernate独有的注解...

    hibernate v3.04中文参考手册

    11. **复合主键与自定义主键生成策略** - 组合主键的定义和映射,使用@EmbeddedId和@IdClass。 - 自定义主键生成策略,如SequenceGenerator、TableGenerator等。 12. **事件监听与拦截器** - 实现Hibernate事件...

    Hibernate v3.2中文参考手册

    实体映射包括一对一、一对多、多对多等多种关系的映射方式,以及如何使用主键、复合主键、外键等来描述实体之间的关联关系。 2. HQL(Hibernate Query Language)讲解:HQL是Hibernate提供的面向对象的查询语言,它...

    hibernate源码分析过程

    Hibernate 的基本映射包括 id 算法、复合主键、数据版本并发性控制等。id 算法可以是整型自增、sql server 等数据库的 identity、Oracle 的 sequence、hilo(高低位)算法、uuid、guid、程序赋值等。复合主键可以...

    hibernate注解.rar

    @JoinColumn用于指定实体间的关联字段,特别是在处理复合主键和外键时非常有用。 四、注解配置的优缺点 4.1 优点 (1)简化配置:注解使得ORM配置更直观,减少了XML配置的工作量。 (2)可读性强:注解直接嵌入...

    hibernate-annotations-3.4.0.GA

    4. 新的持久化模型:支持复合主键、级联操作等更复杂的持久化模型。 5. 可配置的延迟加载:通过注解可以控制属性或关联关系的延迟加载行为。 四、实战应用 1. 创建实体类:利用@Entity、@Table、@Id等注解创建符合...

    hibernate_-annotations_中文帮助文档.doc

    - **复合主键与外键**:使用`@IdClass`和`@JoinColumn`等注解处理复杂主键和外键情况。 - **二级表映射**:`@SecondaryTable`注解用于映射实体到多个表。 4. **Hibernate独有的注解扩展** - **实体、标识符、...

    Hibernate教程08_关系映射之联合主键

    这样做可以让Hibernate知道哪些字段应该被视为复合主键的一部分。 例如,在`s2sh_relation05_one2one_uni_fk_composite`的示例中,假设我们有一个`Student`实体和一个`Address`实体,它们之间存在一对一(One-to-...

Global site tag (gtag.js) - Google Analytics