Проблема в реализации @IdClass

Я использую 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.

С уважением, Ashish

1 ответ

Первой ошибкой было использование экземпляра класса ProjectId для инициализации deptId и projectId. я изменил Project.java, чтобы добавить геттер и сеттер для deptId и projectId.

и вторая ошибка была в том, что я использовал атрибут pid, который является экземпляром класса ProjectId в сущности. Я удалил этот атрибут.

это сработало правильно! Спасибо

Другие вопросы по тегам