Jpa 持久化OneToMany实体会产生javax.faces.el.EvaluationException:javax.ejb.EJBException

Jpa 持久化OneToMany实体会产生javax.faces.el.EvaluationException:javax.ejb.EJBException,jpa,persistence,ejb,jpa-2.0,one-to-many,Jpa,Persistence,Ejb,Jpa 2.0,One To Many,当我尝试save方法时,它会给我一个错误,但是当我尝试手动将数据直接插入数据库时,它工作正常。请问在我的managedbean类中是否有我没有添加或看到的内容?请帮助保持解释尽可能简单明了。谢谢 @Entity @Table(name = "state") @NamedQueries({ @NamedQuery(name = "State.findAll", query = "SELECT s FROM State s"), @NamedQuery(name =

当我尝试save方法时,它会给我一个错误,但是当我尝试手动将数据直接插入数据库时,它工作正常。请问在我的managedbean类中是否有我没有添加或看到的内容?请帮助保持解释尽可能简单明了。谢谢

@Entity
@Table(name = "state")
@NamedQueries({
        @NamedQuery(name = "State.findAll", query = "SELECT s FROM State s"),
        @NamedQuery(name = "State.findByStateId", query = "SELECT s FROM State s WHERE s.stateId = :stateId"),
        @NamedQuery(name = "State.findByStateName", query = "SELECT s FROM State s WHERE s.stateName = :stateName")})
public class State implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "state_id")
    private Integer stateId;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "state_name")
    private String stateName;
    @JoinColumn(name = "country_id", referencedColumnName = "country_id")
    @ManyToOne(optional = false)
    private Country countryId;
}
这是国家实体

@Entity
@Table(name = "country")
@NamedQueries({
    @NamedQuery(name = "Country.findAll", query = "SELECT c FROM Country c"),
    @NamedQuery(name = "Country.findByCountryId", query = "SELECT c FROM Country c WHERE c.countryId = :countryId"),
    @NamedQuery(name = "Country.findByCountryName", query = "SELECT c FROM Country c WHERE c.countryName = :countryName")})
public class Country implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "country_id")
    private Integer countryId;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "country_name")
    private String countryName;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "countryId")
    private List<State> stateList;
}
错误页

javax.faces.el.EvaluationException: javax.ejb.EJBException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)



Caused by: javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details.
    at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.validateOnCallbackEvent(BeanValidationListener.java:90)
    at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.prePersist(BeanValidationListener.java:62)
    at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyListener(DescriptorEventManager.java:698)

正如异常日志明确指出的,您有一个
ConstraintViolationException
。在您的例子中,异常是由
@NotNull
注释引起的,该注释是由
JPA
实现中的
PrePersist
方法生成的

删除
stateId
stateName
字段的
@NotNull
注释将有所帮助,但您可能会从数据库中获得另一个异常。让您了解一下,如果IDE自动生成了
@NotNull
注释,这可能是由于db表中的字段定义所致。如果这是您的情况,并且您使用的是像我一样的MySql db,您将得到:

Internal Exception: java.sql.SQLException: Duplicate key or integrity constraint violation message from server: "Column 'state_id' cannot be null"
在这种情况下,您可能希望为bean中的状态提供
stateId
stateName
(并避免删除
@NotNull
注释):


最后,如果您还将
country\u id
设置为非可选字段,如注释所示,您还必须将国家分配给您所在的州,然后才能将其持久化。

谢谢perissf,我将尝试您的建议。
Internal Exception: java.sql.SQLException: Duplicate key or integrity constraint violation message from server: "Column 'state_id' cannot be null"
state.setStateId(1);
state.setStateName("MyState");