Проблема в реализации @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 в сущности. Я удалил этот атрибут.
это сработало правильно! Спасибо