Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate jpa一对多关系无法给出异常_Hibernate_Jpa 2.0_Hibernate3 - Fatal编程技术网

Hibernate jpa一对多关系无法给出异常

Hibernate jpa一对多关系无法给出异常,hibernate,jpa-2.0,hibernate3,Hibernate,Jpa 2.0,Hibernate3,我正在尝试创建填充Admin和AdminHealthPlan表 两者之间的关系是一对多(一个管理员可以拥有多个健康计划) Admin类定义如下: @Entity @Table(name = "admin") @NamedQueries(value = { @NamedQuery(name = "admin.getAdminById", query = "SELECT a " + "from Admin a WHERE a.id=:id and delet

我正在尝试创建填充Admin和AdminHealthPlan表

两者之间的关系是一对多(一个管理员可以拥有多个健康计划)

Admin
类定义如下:

@Entity
@Table(name = "admin")
@NamedQueries(value = {
        @NamedQuery(name = "admin.getAdminById", query = "SELECT a "
            + "from  Admin a WHERE a.id=:id and deleted = 0"),
        @NamedQuery(name = "admin.getAdminByEmail", query = "SELECT a "
            + "from Admin a where a.email = :email and deleted = 0") })
public class Admin extends Persistent {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "password")
    private String password;
    @Column(name = "email")
    private String email;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "phone")
    private String phone;
    @OneToOne(mappedBy = "admin", fetch = FetchType.EAGER,
            cascade = CascadeType.ALL)
    private AdminRole role;
    @OneToOne(mappedBy = "admin", fetch = FetchType.EAGER,
            cascade = CascadeType.ALL)
    private AdminPasswordToken passwordToken;
    @OneToMany(mappedBy = "admin", fetch = FetchType.EAGER,
            cascade = CascadeType.ALL)
    private Set<AdminHealthPlan> healthPlans;
    @Column(name = "deleted")
    private Boolean deleted = false;
    @Column(name = "security_question")
    private Integer securityQuestion;
    @Column(name = "security_answer")
    private String securityAnswer;

    public Admin() {}

    // Getters/setters
}
我通过从请求中检索值并将其设置为admin对象来创建admin对象,类似地,创建admin health plan set对象并在admin对象中进行设置,最后发送对象以保存到db

它给出了如下例外

2012年5月21日下午6:49:16 org.apache.catalina.core.StandardWrapperValve调用
严重:Servlet appServlet的Servlet.service()引发异常
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列“admin\u id”不能为空
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:406)
位于com.mysql.jdbc.Util.getInstance(Util.java:381)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
在com.mysql.jdbc.MysqlIO.checkErrorPacket上(MysqlIO.java:3558)
在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)上
位于com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
位于com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
位于com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
位于com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
位于com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362)
位于com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2280)
位于com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265)
位于org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
位于org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
位于org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
在$Proxy70.executeUpdate(未知来源)
ws

用于创建Admin和AdminHealthPlan对象:

private Admin createAdminDummyObject() {
        Admin admin = new Admin();
        admin.setFirstName("Zuned");
        admin.setLastName("Ahmed");
        admin.setEmail("zuned@hcentive.com");
        admin.setPhone("123-1234454");
        admin.setHealthPlans(getHealthPlans(admin));
        return admin;
    }

    private Set<AdminHealthPlan> getHealthPlans(Admin admin) {
         Set<AdminHealthPlan> adminAHP = new HashSet<AdminHealthPlan>();
         AdminHealthPlan ahp = new AdminHealthPlan();
         ahp.setAdmin(admin);
         ahp.setHealthPlan("Plan1");
         adminAHP.add(ahp);
        return adminAHP;
    }
在数据库中持久化


有谁能告诉我我遗漏了什么吗?

我使用EclipseLink,所以我不确定它在hibernate中是否做得不同,但我认为这是错误的:

1-您没有将@Column注释添加到管理实体的id属性中
2-我总是对pks使用GenerationType.IDENTITY。 3-在表AdminHealthPlan中,admin属性具有JoinColumn注释,但未包含referencedColumnName属性。它应该是这样的:
@JoinColumn(name=“admin\u id”,referencedColumnName=“admin\u id”)

4-要向管理实体添加新的AdminHealthPlan,我建议您执行以下操作:在Admin类中创建一个名为“addAdminHealthPlan”的方法:

private Admin createAdminDummyObject() {
        Admin admin = new Admin();
        admin.setFirstName("Zuned");
        admin.setLastName("Ahmed");
        admin.setEmail("zuned@hcentive.com");
        admin.setPhone("123-1234454");
        admin.setHealthPlans(getHealthPlans(admin));
        return admin;
    }

    private Set<AdminHealthPlan> getHealthPlans(Admin admin) {
         Set<AdminHealthPlan> adminAHP = new HashSet<AdminHealthPlan>();
         AdminHealthPlan ahp = new AdminHealthPlan();
         ahp.setAdmin(admin);
         ahp.setHealthPlan("Plan1");
         adminAHP.add(ahp);
        return adminAHP;
    }
getJpaTemplate().persist(t);
public void addAdminHealthPlan(AdminHealthPlan ahp) {
    if(healthPlans == null) {
          healthPlans = new HashSet<AdminHealthPlan>();
    }
    ahp.setAdmin(this);
    healthPlans.add(ahp);
}
Admin admin = createAdminDummyObject();
AdminHealthPlan ahp = new AdminHealthPlan();
ahp.setAdmin(admin);
ahp.setHealthPlan("Plan1");
admin.addAdminHealthPlan(ahp);
entityManager.persist(admin);