2016-03-30 5 views
0

Ich habe folgende Modellobjekte in einer Java EE-Anwendung:JPA EJBException id null auf EntityManager.persist()

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. 

Die ManagedBean ist wie folgt:

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 und Person Objekte sind mit einem <h:form> in einer JSF-Seite gefüllt. Debuggen des Programms Ich kann sehen, dass in Breakpoint 1 die Felder person.idPerson und user.idPerson beide NULL sind. In Breakpoint 2person.idPerson hat einen Wert, aber user.idPerson ist immer noch NULL. Die gefangen Exception ist ein EJBException (gemäß der Beschreibung Variablen in NetBeans) und die Nachricht ist:

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 

Ich kann nicht finden, wo das Problem ist. Ich verwende JavaEE 7 mit JDK 1.8, JSF 2.2 und EclipseLink 2.5.2 als Persistence Provider.

Jede Hilfe wird geschätzt. Vielen Dank im Voraus

+0

Es gibt keine Einheit mit einem Tabellennamen von Benutzer. –

+0

Es tut uns leid, es ist ein Übersetzungsfehler, muss 'user' sein, wo Sie' usuario' lesen (Benutzer in Spanisch). Normalerweise "übersetze" ich den Variablennamen für ein besseres "internationales Verständnis" des Variablenzwecks. Ich werde es jetzt ändern –

Antwort

0

Ich glaube, Sie wollten die gleiche PK für beide Person und User Tabelle verwenden.

Aktualisieren Sie Ihre Einheiten @MapsId Annotation zu verwenden, wie unten:

@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; 
} 

Und beim Speichern, setzen Sie das Person Feld im User Objekt als:

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