我使用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
答案 0 :(得分:0)
第一个错误是,我使用ProjectId类的实例来初始化deptId和projectId。 我修改了Project.java,为deptId和projectId添加了getter和setter。
第二个错误是我使用了pid属性,它是实体中ProjectId类的一个实例。我删除了这个属性。
它运作正常! 感谢