@Entity
   @Table(name="test_student")
    public class Student{
     private int id;
     private String name;
     private Teacher teacher;     @Id
     @GeneratedValue
     public int getId(){
     return 
    }
     public String getName() {
        return name;
    }
     public void setId(int id){
       this.id=id;
    }
    public void setName(String name) {
        this.name = name;
    }
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="teacher_id")
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher =teacher;
    }
}    
    @Entity
    @Table(name="test_teacher")
    public class Teacher{
    private int id;
    @public int getId(){
    return id;
  }
   .....
}
  测试后的建表语句是
create table test_student
        id integer not null auto_increment,
        name varchar(255),
        teacher_id number(10,0),
        primary key (id)
    )    create table test_teacher{
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )    alter table test_                  
        add constraint FK4347BB8E274DEC50
        foreign key (teacher_id)
        references test_teacher
   正规的后面不是还要多个references test_teacher(id)吗?
   感觉上是teacher_id关联着Teacher整张表而不是Teacher那张表的id
   还是有哪个地方Annotation没有配
   

解决方案 »

  1.   

    正规的后面不是还要多个references test_teacher(id)吗?
      感觉上是teacher_id关联着Teacher整张表而不是Teacher那张表的id谁和楼主说正规的是要多个references test_teacher(id)的指向某个列的?
    这样说吧,如果你不指明test_teacher(Id)的话,那么系统会默认去指向test_teacher的主键的。懂了吧?
    知道为什么你在建立外键关系的时候,如果references的那个表没有主键就会创建失败,不让你创建了吧?因为如果你不写成references test_teacher(id),而是写成references test_teacher,那么他就会默认指向表test_teacher的主键。如果这个表没有主键,当然就不让你创建了。从这一点也可以反过来说明,如果你不指明某个列,那么他就会指向这个表的主键。明白了?
      

  2.   

    没明白,我2个表都有主键,建表的时候不是显示出来了么
    create table test_student
      id integer not null auto_increment,
      name varchar(255),
      teacher_id number(10,0),
      primary key (id)
      )  create table test_teacher{
      id integer not null auto_increment,
      name varchar(255),
      primary key (id)
      )
      

  3.   

    是啊,正因为你两个表都有主键,你的那句话才不会有错误
    alter table test_   
      add constraint FK4347BB8E274DEC50
      foreign key (teacher_id)
      references test_teacher
    你把test_teacher表的主键去了再执行这句话试试,一定报错。说你这个表没有主键。这不是说明问题了吗,你这句话没指定test_teacher的列,那他就默认指向test_teacher的主键。你的表有主键,那就没问题。如果没有,就会报错。我想我只能说这么多了。再不理解我没办法了
      

  4.   

    我的意思是到数据库里面应该是
    test_teacher表里面主键id对应
    test_student里面的teacherid外键
    正常约束下来应该是
    add constraint FK4347BB8E274DEC50
      foreign key (teacher_id)
      references test_teacher(id)(这里应该有个id的)
    而我输出的没有Id
    是不是当于test_student表里面的teacherid外键对应的主键不是test_teacher表里面的id了?
    那对应的又是什么?
      

  5.   

    [Quote=引用 4 楼 chenzhiming88 的回复:]
    我的意思是到数据库里面应该是
    test_teacher表里面主键id对应
    test_student里面的teacherid外键
    正常约束下来应该是
    add constraint FK4347BB8E274DEC50
      foreign key (teacher_id)
      references test_teacher(id)(这里应该有个id的)
    而我输出的没有Id
    是不是当于t……
    [/Quote你输出的是没有。但是他的确已经指向test_teacher的ID了。因为默认就是指向主键。OK?你就说你的test_teacher里的ID是不是主键吧!如果是,输出的这段语句是没错的,就是建立了与test_teacher的主键ID对应的外键关系了