2012-05-21 2 views
1

채우기 Admin 및 AdminHealthPlan 테이블을 생성하려고합니다.jpa 1 대 다수의 관계가 예외를 허용하지 못함

두 사람 사이의 관계는 일대일 (1 명의 관리자는 많은 건강 계획을 소유 할 수 있음)입니다. 다음과 같이

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 
} 

AdminHealthPlan 클래스를 정의했다.

@Entity 
@Table(name = "admin_health_plan") 
public class AdminHealthPlan implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Column(name = "health_plan") 
    private String healthPlan; 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "admin_id", nullable = false) 
    private Admin admin; 
    @Column(name = "deleted") 
    private Boolean deleted = false; 

    public AdminHealthPlan() {} 

    public AdminHealthPlan(String healthPlan) { 
     this.healthPlan = healthPlan; 
    } 

    // Getters/setters 
} 

내가 요청에서 값을 검색하고 관리 건강 보험 설정 객체를 생성 및 관리 객체를 설정하고 마지막으로 DB에 저장하는 객체를 전송하기 위해 유사하게 관리 객체로 설정에 의해 관리자 개체를 만듭니다. 관리자 및 AdminHealthPlan 객체를 생성하기위한

May 21, 2012 6:49:16 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet appServlet threw exception 
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'admin_id' cannot be null 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.Util.getInstance(Util.java:381) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2280) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265) 
    at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
    at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
    at $Proxy70.executeUpdate(Unknown Source) 

WS

를 다음과 같이 예외를주고있다

:

private Admin createAdminDummyObject() { 
     Admin admin = new Admin(); 
     admin.setFirstName("Zuned"); 
     admin.setLastName("Ahmed"); 
     admin.setEmail("[email protected]"); 
     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); 

사용은 DB에 유지됩니다.

어떤 몸이라도 무엇이 놓치고 있는지 알려주실 수 있습니까?

답변

2

내가는 EclipseLink를 사용하므로 최대 절전 모드에서 다른 끝낼 경우 잘 모르겠어요,하지만 내가 잘못 볼 것입니다 :

1 당신의 id 속성에 @Column 주석을 추가하지 않은 관리 엔티티.
2 - 저는 항상 Pks에 GenerationType.IDENTITY를 사용합니다. 3 - AdminHealthPlan 테이블에서 admin 속성에 JoinColumn 주석이 있지만 referencedColumnName 속성을 포함하지 않았습니다. 그것은 다음과 같아야합니다 : @JoinColumn(name = "admin_id", referencedColumnName = "admin_id")
4- 관리자 개체에 새 AdminHealthPlan를 추가, 난 당신이 다음을 수행하는 것이 좋습니다 :

public void addAdminHealthPlan(AdminHealthPlan ahp) { 
    if(healthPlans == null) { 
      healthPlans = new HashSet<AdminHealthPlan>(); 
    } 
    ahp.setAdmin(this); 
    healthPlans.add(ahp); 
} 

나는 '돈 : "addAdminHealthPlan"라는 관리자 클래스의 메소드를 만들 getJpaTemplate() 메소드와 객체 "t"는 무엇인지 알지만 관리자를 유지하는 논리가됩니다.

Admin admin = createAdminDummyObject(); 
AdminHealthPlan ahp = new AdminHealthPlan(); 
ahp.setAdmin(admin); 
ahp.setHealthPlan("Plan1"); 
admin.addAdminHealthPlan(ahp); 
entityManager.persist(admin); 
+0

답장 문제는 4 번 점입니다. –