实现@IdClass的问题

时间:2017-08-16 18:39:01

标签: jpa composite-id

我使用jpa和hibernate作为jpa提供程序。

在jpa中学习复合主键概念后,我试图使用@IdClass注释实现相同的功能。

我创建了一个Project.java,在这里我想使用deptId和projectId作为我的复合键。

所以根据互联网上提到的概念,我把deptId和projectId保存到ProjectID.class

请看下面的ProjectID.java

public class ProjectID implements Serializable {

    private String deptId;
    private String projectId;

    public ProjectID()
    {

    }

    @Override
    public int hashCode()
    {
        int result=1;
        int prime=31;
        result = prime*result + ((deptId==null) ? 0 : deptId.hashCode());

        result = result +  (prime*result + ((projectId==null) ? 0 : projectId.hashCode()));

        return result;
    }

    @Override
    public boolean equals(Object obj)
    {
        if(this==obj)
            return true;
        if(obj==null) return false;

        if(this.getClass() != obj.getClass())
            return false;
        ProjectID pId = (ProjectID)obj;
        if(deptId==null)
            if(pId.deptId!=null)
                return false;

        if(projectId==null)
            if(pId.projectId!=null)
                return false;

        return true;

    }

    public String getDeptId() {
        return deptId;
    }

    public void setDeptId(String deptId) {
        this.deptId = deptId;
    }

    public String getProjectId() {
        return projectId;
    }

    public void setProjectId(String projectId) {
        this.projectId = projectId;
    }

}

正如您所看到的,我已经实现了Serializable接口,equals和hashcode方法。

现在看一下Project.java

@Entity
@IdClass(entity.beans.ProjectID.class)
public class Project {

    @Id
    private String deptId;

    @Id
    private String projectId;

    private String name;

    public ProjectID getPid() {
        return pid;
    }

    public void setPid(ProjectID pid) {
        this.pid = pid;
    }

    private String manager;

    private ProjectID pid;

    private int headCount;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getManager() {
        return manager;
    }

    public void setManager(String manager) {
        this.manager = manager;
    }

    public int getHeadCount() {
        return headCount;
    }

    public void setHeadCount(int headCount) {
        this.headCount = headCount;
    }
}

现在这是件,我不确定。如果这是对的,请告诉我。

我正在使用以下类来持久保存Project实体。

public class DemoProject {

    EntityManagerFactory emf;
    EntityManager manager; 
    String persistenceUnitName="chapter.three";

    DemoProject()
    {
        emf = Persistence.createEntityManagerFactory(persistenceUnitName);
        manager = emf.createEntityManager();
    }

    public void runTheShow()
    {
        manager.getTransaction().begin();
        ProjectID id = new ProjectID();
        id.setDeptId("QA");
        id.setProjectId("Auto");

        Project p1 = new Project();
        p1.setName("World Bank");
        p1.setHeadCount(26);
        p1.setManager("Mr.Ashish");
        p1.setPid(id);
        manager.persist(p1);
        manager.getTransaction().commit();
        manager.close();
        emf.close();
    }

    public static void main(String args[])
    {
        DemoProject ob = new DemoProject();
        ob.runTheShow();
    }

}

执行上面的代码时,我无法初始化由@Id注释标记的字段。我收到错误“ORA-01400:无法插入NULL(”SYSTEM“。”PROJECT“。”DEPTID“)”

我需要帮助通过jpa注释正确配置复合键。

的问候, ashish

1 个答案:

答案 0 :(得分:0)

第一个错误是,我使用ProjectId类的实例来初始化deptId和projectId。 我修改了Project.java,为deptId和projectId添加了getter和setter。

第二个错误是我使用了pid属性,它是实体中ProjectId类的一个实例。我删除了这个属性。

它运作正常! 感谢