EntityManager.persist()上的JPA EJBException id为null

EntityManager.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 =

我在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 = "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
。通常我“翻译”变量名称是为了更好地“国际理解”变量的用途。我现在就换