2016-03-30 21 views
0

ben bir Java EE uygulamasında aşağıdaki modeli nesneler:JPA EJBException id entityManager.persist() üzerinde boş

Person.java

@Entity 
@Table(name = "person") 
public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id_person") 
    private Integer idPerson; 

    // some other fields (name, birthdate, etc.) 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "person") 
    private User user; 

    // Constructors, get/set, etc. 

User.java

@Entity 
@Table(name = "user") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Basic(optional = false) 
    @Column(name = "id_person") // Because it's a FK 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer idPerson; 

    // some other fields (username, etc) 

    @JoinColumn(name = "id_person", referencedColumnName = "id_persona", insertable = false, updatable = false) 
    @OneToOne(optional = false, cascade = CascadeType.PERSIST) 
    private Person person; 

    // Constructors, get/set, etc. 

ManagedBean aşağıdaki gibidir:

UserController.java

@ManagedBean(name = "usuarioController") 
@ViewScoped 
public class UsuarioController implements Serializable{ 
    private static final long serialVersionUID = 7002352152240769558L; 

    @EJB 
    private UserFacadeLocal userEJB; 
    private Person person; 
    private User user; 

    @PostConstruct 
    public void init() { 
     person = new Person(); 
     user = new User(); 
    } 

    // getters/setters 

    public void register(){ 
    try{ 
     this.user.setPerson(person); 
     this.person.setUser(user); // BreakPoint 1 
     userEJB.create(user); 
     // Success Message 
     } catch (Exception e){ // Breakpoint 2 
      // Error message 
     } 
    } 

User ve Person nesneler bir JSF sayfasında bir <h:form> ile doldurulur. Hata ayıklama programı, Breakpoint 1 içinde person.idPerson ve user.idPerson alanlarının NULL olduğunu görebiliyorum. Breakpoint 2person.idPerson'da bir değer var, ancak user.idPerson hala NULL. yakalandı Exception (NetBeans değişkenler bilgi ile göre) bir EJBException ve mesajdır: Sorun nerede olduğunu bulamıyorum

Error Code: 1048 
Call: INSERT INTO user (id_person, ...) VALUES (?, ?, ?, ?, ?) 
    bind => [5 parameters bound] 
Query: InsertObjectQuery(model.User[ idPerson=null ]) 
...stacktrace... 
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'id_person' cannot be null 

. JavaEE 7'yi JDK 1.8, JSF 2.2 ve EclipseLink2.5.2 ile Kalıcı Sağlayıcı olarak kullanıyorum.

Herhangi bir yardım için teşekkür ederiz. Teşekkürler

+0

Kullanıcı –

+0

Üzgünüz, bu bir çeviri hatası, 'usuario' (kullanıcı ispanyolca) okuduğunuz yerde olmalıdır. Genellikle, değişkenin amacının daha iyi bir "uluslararası anlayış" için değişkenler adını "çeviririm". Şimdi değiştireceğim –

cevap

0

Aynı PK'yi hem Person hem de User tablosunda kullanmak istediğinizi düşünüyorum.

güncelleme kişiler aşağıda @MapsId ek açıklama, kullanımı:

@Entity 
@Table(name = "person") 
public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id_person") 
    private Integer idPerson; 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "person") 
    User user; 

    @Override 
    public String toString() { 
     return "Person [idPerson=" + idPerson + ", user=" + user.person.idPerson + "]"; 
    } 
} 

@Entity 
@Table(name = "user") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "id_person") 
    Integer idPerson; 

    @OneToOne 
    @JoinColumn(name = "id_person", referencedColumnName = "id_person", insertable = false, updatable = false) 
    @MapsId 
    Person person; 
} 

Ve tasarruf ederken, olarak User nesnede Person alan belirlemiş: Bir tablo adı ile bir varlık yoktur

Person person = new Person(); 
User user = new User(); 
person.user = user; 
user.person = person; 
userEJB.create(person); or userEJB.create(user);