EntityManager.persist()上的JPA EJBException id为null
我在Java EE应用程序中有以下模型对象: Person.javaEntityManager.persist()上的JPA EJBException id为null,jpa,constraints,one-to-one,Jpa,Constraints,One To One,我在Java EE应用程序中有以下模型对象: Person.java @Entity @Table(name = "person") public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name =
@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.
@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(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.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.
@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(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
}
}
ManagedBean
如下所示:
UserController.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.
@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(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
和Person
对象在JSF页面中用
填充。调试程序时,我可以看到在断点1中,person.idPerson
和user.idPerson
字段均为空。在断点2中,person.idPerson有一个值,但user.idPerson仍然为空。捕获的异常
是一个EJBException
(根据NetBeans中的变量描述),消息是:
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
我找不到问题出在哪里。我将JavaEE7与JDK1.8、JSF2.2和EclipseLink2.5.2一起用作持久性提供者
感谢您的帮助。提前感谢我想您希望对
个人
和用户
表使用相同的PK
更新实体以使用@MapsId
注释,如下所示:
@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;
}
保存时,将User
对象中的Person
字段设置为:
Person person = new Person();
User user = new User();
person.user = user;
user.person = person;
userEJB.create(person); or userEJB.create(user);
没有表名为User的实体。很抱歉,这是翻译错误,必须是您阅读的
usuario
(西班牙语用户)中的User
。通常我“翻译”变量名称是为了更好地“国际理解”变量的用途。我现在就换