例如我有两个表:
Student(id,name,age)Teacher(id,name,age)我现在想生成例外一张表,Score学生分数统计表(studentId,teacherId,score)我想用hibernate注解的方式生成这个表:Student类{
id
name
age
@Id
getId()方法
}
Teacher类{
id
name
age
@Id
getId()方法}hibernate注解联合主键
Student(id,name,age)Teacher(id,name,age)我现在想生成例外一张表,Score学生分数统计表(studentId,teacherId,score)我想用hibernate注解的方式生成这个表:Student类{
id
name
age
@Id
getId()方法
}
Teacher类{
id
name
age
@Id
getId()方法}hibernate注解联合主键
解决方案 »
- Jquery 怎样对同一名称的多个表单进行验证
- 关于checkboxlist选中取值的问题,
- struts spring hibernate 如何进行整合啊?
- session.createSQLQuery为什么不能更新数据库???急
- 一个准备进入软件企业的新人
- spring mvc + mybatis 事务不回滚
- 报表引擎的问题?怎样处理业务数据的处理问题?
- struts problem???
- resin+mysql+hibernate运行错误,请帮我看看
- 我想阅读Weblogic带的那个宠物店的例子,哪位仁兄能够提供一些资料,感激不仅!
- spring rest json xml
- action中拿不到页面发来的参数!
就是组合主键的问题
就是组合主键的问题
也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略。具体如下:
可以使用一个组件作为一个实体类的标识符。你的组件类必须满足以下要求:
?它必须实现 java.io.Serializable 接口
?它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致
注意:在 Hibernate3 中,第二个要求并非是 Hibernate 强制必须的。但最好这样做。
不能使用一个 IdentifierGenerator 产生组合关键字。一个应用程序必须分配它自己的标识符。
具体做法如下步骤:
1.写一个包含表中联合主键的所有字段的类,作为主键类,实例如下:
/**
* 这个类作为Person类的(组合主键)主键类
*
* @author Administrator
*
*/
public class PersonUionPKID implements java.io.Serializable { private String firstName; private String secondName; public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getSecondName() {
return secondName;
} public void setSecondName(String secondName) {
this.secondName = secondName;
} @Override
public boolean equals(Object obj) {
if(obj instanceof PersonUionPKID){
PersonUionPKID pk=(PersonUionPKID)obj;
if(this.firstName.equals(pk.firstName)&&this.secondName.equals(pk.secondName)){
return true;
}
}
return false;
} @Override
public int hashCode() {
return super.hashCode();
}}
这里要特别注意,如hibernate API文档所述,主键类必须实现java.io.Serializable接口,而且推荐用自己的
方法override equals() 和hashCode()方法,保证主键的唯一性.2.再写一个类与表字段相当的类,这个类里面不一定要包含表主键的所有字段,实例如下:
public class Person { PersonUionPKID uionPKID = new PersonUionPKID(); private int age; private String sex; private String job; public PersonUionPKID getUionPKID() {
return uionPKID;
} public void setUionPKID(PersonUionPKID uionPKID) {
this.uionPKID = uionPKID;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getJob() {
return job;
} public void setJob(String job) {
this.job = job;
} }3.配置hibernate配置文件,实例如下:<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.seed.lee.model">
<class name="Person" table="person">
<composite-id name="uionPKID" class="com.seed.lee.model.PersonUionPKID">
<key-property name="secondName" />
<key-property name="firstName" />
</composite-id>
<property name="age" column="age" />
<property name="sex" length="2" />
<property name="job" length="50" />
</class>
</hibernate-mapping>
4.不要忘记在hibernate配置文件中引用映射文件。
<mapping resource="com/seed/lee/model/Person.hbm.xml" />具体参考hibernate3 API文档中的 “组件作为联合标识符(Components as composite identifiers)”说明。
就是组合主键的问题才看到你回复,上面的都已经给你解答了,另外一定要注意equals和hashCode的重写,根本目的就是判断两个复合主键类中的两个属性值是否相同这映射到数据库中就是两条数据的复合主键的值是否都相同
@JoinColumn(name = "student_id")而在setScore中则需要@manytoMany
@JoinTable(name="score",
joinColumns=@JoinColumn(name="student_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="score",referencedColumnName="id"))写对应的多对多关系就可以了