无法通过<class> </class>的反射设置器设置字段值

时间:2015-04-09 17:52:15

标签: java hibernate


我在这个论坛上看到过类似的问题,这里是Mapping Value in Junction Table & hibernate.PropertyAccessException: could not set a field value by reflection setter 我已经应用了这个问题中提到的解决方案,但我仍面临同样的问题。我不知道我错过了什么。 我的班级 -

EmployeeID.java

@IdClass(value = EmployeeID.class)
public class EmployeeID implements Serializable{

    private int empID;
    private int deptID;

    public EmployeeID() {

    }

    public EmployeeID(int empID, int deptID) {
        this.empID = empID;
        this.deptID = deptID;
    }

    public int getEmpID() {
        return empID;
    }

    public int getDeptID() {
        return deptID;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + deptID;
        result = prime * result + empID;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        EmployeeID other = (EmployeeID) obj;
        if (deptID != other.deptID)
            return false;
        if (empID != other.empID)
            return false;
        return true;
    }


}

Employee.java

@Entity(name="EMPLOYEE")
@IdClass(value = EmployeeID.class)
public class Employee {

    @Id @GeneratedValue
    @Column(name="EMP_ID")
    private int empID;

    @Id @GeneratedValue
    @Column(name="DEPT_ID")
    private int deptID;

    public int getEmpID() {
        return empID;
    }
    public void setEmpID(int empID) {
        this.empID = empID;
    }
    public int getDeptID() {
        return deptID;
    }
    public void setDeptID(int deptID) {
        this.deptID = deptID;
    }

    @Column(name="EMP_NAME")
    private String empName;

    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
}

这是我的测试代码 -

try {
            Employee emp = new Employee();
            emp.setEmpName("New Employee");

            Session session = factory.openSession();
            session.beginTransaction();

            session.save(emp);

            session.getTransaction().commit();
            session.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            factory.close();
        }

在运行此测试代码时,我得到此异常跟踪 -

org.hibernate.PropertyAccessException: could not set a field value by reflection setter of EmployeeID.deptID
    at org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:134)
    at org.hibernate.mapping.Component$ValueGenerationPlan.execute(Component.java:441)
    at org.hibernate.id.CompositeNestedGeneratedValueGenerator.generate(CompositeNestedGeneratedValueGenerator.java:121)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)
    at CompositeKeyDemo.main(CompositeKeyDemo.java:15)
Caused by: java.lang.IllegalArgumentException: Can not set int field EmployeeID.deptID to org.hibernate.id.IdentifierGeneratorHelper$2
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:98)
    at java.lang.reflect.Field.set(Field.java:741)
    at org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:122)
    ... 12 more

我做的事情很傻。

在此先感谢!!

1 个答案:

答案 0 :(得分:3)

我认为您不能将@GeneratedValue与@IdClass一起使用。

相关问题