我在Java EE应用程序中有以下模型对象:
人.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.
用户.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
如下:
用户控制器.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
和Person
对象在 JSF 页中用<h:form>
填充。调试程序时,我可以看到Breakpoint 1
字段person.idPerson
和user.idPerson
都是 NULL。In Breakpoint 2
person.idPerson
有一个值,但user.idPerson
仍然是 NULL。捕获的Exception
是一个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
我找不到问题所在。我正在使用JavaEE 7和JDK 1.8,JSF 2.2和EclipseLink2.5.2作为持久性提供程序。
任何帮助,不胜感激。提前致谢
我想你想对Person
和User
表使用相同的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);