0

我正在使用 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;
    }
}

现在这是一块,我不确定。请告诉我这是否正确。

我正在使用以下类来持久化项目实体。

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 注释正确配置复合键的帮助。

问候,阿什

4

1 回答 1

0

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

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

它工作正常!谢谢

于 2017-08-17T18:07:03.237 回答