JPA EJBException id is null on EntityManager.persist()



我在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
        }
    }

UserPerson对象在 JSF 页中用<h:form>填充。调试程序时,我可以看到Breakpoint 1字段person.idPersonuser.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作为持久性提供程序。

任何帮助,不胜感激。提前致谢

我想你想对PersonUser表使用相同的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);

最新更新