我正在使用 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 注释正确配置复合键的帮助。
问候,阿什