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 2
person.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
Es gibt keine Einheit mit einem Tabellennamen von Benutzer. –
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 –