例如我有两个表:
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注解联合主键

解决方案 »

  1.   

    就是新建的表Store有两个主键()分别引用了student的id和teacher的id
    就是组合主键的问题
      

  2.   

    就是新建的表Store有两个主键()分别引用了student的id和teacher的id
    就是组合主键的问题
      

  3.   

    hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,
    也就是联合主键,这个时候就可以使用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)”说明。
      

  4.   

    嗯很好,但是有是hibernate注解使用的吗
      

  5.   

    就是新建的表Store有两个主键()分别引用了student的id和teacher的id
    就是组合主键的问题才看到你回复,上面的都已经给你解答了,另外一定要注意equals和hashCode的重写,根本目的就是判断两个复合主键类中的两个属性值是否相同这映射到数据库中就是两条数据的复合主键的值是否都相同
      

  6.   

    注解很简单了,在复合主键类加一个注解@Embeddable,在你引用复合主键类的get方法上加一个@EmbeddedId,就哦了
      

  7.   

    分别写studend,teacher,score的三个set,get方法,在setStudent和setTeacher中加上注解:@ManyToOne
    @JoinColumn(name = "student_id")而在setScore中则需要@manytoMany
    @JoinTable(name="score",
    joinColumns=@JoinColumn(name="student_id", referencedColumnName="id"),
    inverseJoinColumns=@JoinColumn(name="score",referencedColumnName="id"))写对应的多对多关系就可以了