前几天用hibernate映射数据库产生了实体类,其中两个表叫左dept和emp,以下是它的实体类,我从数据库表联系发现他们之间是@OnetoMany @ManyToOne的双向关联,所以我就使用了关联,我的框架是SSH框架我使用的是hibernateTemplate让它自动生成代码,我在测试列出方法的时候报错了。
错误是java.sql.SQLSyntaxErrorException: ORA-00904: "THIS_"."DEPT_DNO": 标识符无效
hibernateTemplate给我自动生成的ORACLE sql语句是
Hibernate: 
    select
        this_.empno as empno1_1_,
        this_.dept_dno as dept8_1_1_,
    from
        Emp this_,
        Dept dept2_ 
    where
        this_.dept_dno=dept2_.dno(+)以下是数据库表

Emp序号 列名 数据类型 长度 小数位 标识 主键 允许空 默认值 说明
1 EMPNO VARCHAR2 40 是 否 PK
2 DNO VARCHAR2 40 是 FK dept(dno)
Dept序号 列名 数据类型 长度 小数位 标识 主键 允许空 默认值 说明
1 DNO VARCHAR2 20 是 否 PKDept.java@Entity
public class Dept { // Fields private String dno;
private Set<Emp> emps = new HashSet<Emp>(); @OneToMany(mappedBy="dept",cascade={CascadeType.ALL})
public Set<Emp> getEmps() {
return emps;
} public void setEmps(Set<Emp> emps) {
this.emps = emps;
} @Id
public String getDno() {
return this.dno;
}
public void setDno(String dno) {
this.dno = dno;
}Emp.java
@Entity
public class Emp implements java.io.Serializable { // Fields private String empno;
private Dept dept;@Id
public String getEmpno() {
return this.empno;
} public void setEmpno(String empno) {
this.empno = empno;
}
@ManyToOne
public Dept getDept() {
return this.dept;
} public void setDept(Dept dept) {
this.dept = dept;
}
@OneToMany(mappedBy="emp")
public Set<EmpRole> getEmpRoles() {
return empRoles;
}
public void setEmpRoles(Set<EmpRole> empRoles) {
this.empRoles = empRoles;
}

解决方案 »

  1.   

    错误是java.sql.SQLSyntaxErrorException: ORA-00904: "THIS_"."DEPT_DNO": 标识符无效异常已经写得很清楚了 emp表没有"DEPT_DNO"字段能不错吗?
      

  2.   

    但我的Oracle数据库表根本就没这字段啊,我数据库字段只有数据dept的dno主键,数据emp的dno外键,根本就没有这个dept_dno啊
      

  3.   

    因为你只是指明了关系,没有指明关联的外键字段名(dno),Hibernate默认找了dept_dno的字段,而你表中没有,所以报错了。。
      

  4.   

    @ManyToOne
    @JoinColumn(name = "dno")
        public Dept getDept() {
            return this.dept;
        }
      

  5.   

     @ManyToOne
     @JoinColumn(name = "XXX")
        public Dept getDept() {
            return this.dept;
        }
      

  6.   

     @OneToMany(mappedBy="emps")
        public Set<EmpRole> getEmpRoles() {
            return empRoles;
        }
      

  7.   

    按你这样写法,我运行是么报错了,但是我的emp读取dno读不出来啊?那该怎么办呢
      

  8.   

    按你这样写法,我运行是么报错了,但是我的emp读取dno读不出来啊?那该怎么办呢
      

  9.   

    我上面的报错不是因为这个而报错的,可能这个也会有错误,但我的页面测试的是emp和dept的关联
      

  10.   

    我弄了一下,可以读出来了,但在save的时候,我有个字段的类型是Date和double类型的,在页面jsp注入Action的时候是String类型的,所以save的时候会说类型错误,我要怎么改,才可以保存大呢?还有我在做另外一个模块,在imp和Service层都没事,但回到Action中就无法注入到List中,这是什么问题呢?
      

  11.   

    1. 你可以在Action里面就用Date和double类型,Struts会帮你自动转型的
    2. 在imp和Service层都没事,但回到Action中就无法注入到List中,是不是报错了session colsed!!
      

  12.   

    1. 你可以在Action里面就用Date和double类型,Struts会帮你自动转型的
    2. 在imp和Service层都没事,但回到Action中就无法注入到List中,是不是报错了session colsed!!
      

  13.   

    现在是我从数据库读到所有数据了,我要读取那个EMP额jsp页面输入的数据就在Action里面说类型不同无法注入
    报错句子是ognl.MethodFailedException: Method "setHiredate" failed for object com.yi.dto.Emp@6fcbee [java.lang.NoSuchMethodException: setHiredate([Ljava.lang.String;)]和ognl.MethodFailedException: Method "setSal" failed for object com.yi.dto.Emp@6fcbee [java.lang.NoSuchMethodException: setSal([Ljava.lang.String;)],我的实体类这两个字段是 private Date hiredate;
    private double sal;
      

  14.   

    问题2解决了,但问题1是还没解决,我是在jsp输入我想要的信息之后点解提交就报错类型不同的错了
      

  15.   

    我的数据库是oracle我的实体类就是用hibernate直接映射的,不是我手写的,所以是和数据库的类型一致的
      

  16.   

    我的数据库是oracle我的实体类就是用hibernate直接映射的,不是我手写的,所以是和数据库的类型一致的
    所以我的实体类变量是    private Date hiredate;
        private double sal;
    public Date getHiredate() {
    return this.hiredate;
    } public void setHiredate(Date hiredate) {
    this.hiredate = hiredate;
    } public double getSal() {
    return this.sal;
    } public void setSal(double sal) {
    this.sal = sal;
    }
      

  17.   

    不知道hibernate与jpa注解配置是否一致
    若是的话,上面的注解配置中缺少一些属性