首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >持久化OneToMany实体会产生javax.faces.el.EvaluationException: javax.ejb.EJBException

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

Stack Overflow用户
提问于 2012-08-02 15:33:32
回答 1查看 1.7K关注 0票数 0

当我尝试save方法时,它会给我一个错误,但是当我尝试手动将数据直接插入数据库时,它工作得很好。有没有什么东西没有在我的managedbean类中添加或看到?请尽量保持简单明了的解释。谢谢

代码语言:javascript
复制
@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;
}

这是国家/地区实体

代码语言:javascript
复制
@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;
}

ManagedBean

代码语言:javascript
复制
public class stateManagedBean {
    @EJB
    private SessionBean sessionBean;
    @EJB
    private stateSessionBean stateSessionBean;
    private State state = new State();

    public stateManagedBean() {

    }
    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void save(){
        stateSessionBean.persist(state);
    }        
}

错误页

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2012-08-03 03:41:29

正如异常日志清楚地指出的那样,您拥有一个ConstraintViolationException。在本例中,异常是由@NotNull注释引起的,该注释是由JPA实现中的PrePersist方法生成的。

删除stateId和stateName字段的@NotNull注释会有所帮助,但您的数据库可能会出现另一个异常。让您了解一下,如果@NotNull注释是由您的集成开发环境自动生成的,这可能是由于数据库表中的字段定义造成的。如果这是您的情况,并且您使用的是像我一样的MySql数据库,那么您将得到:

代码语言:javascript
复制
Internal Exception: java.sql.SQLException: Duplicate key or integrity constraint violation message from server: "Column 'state_id' cannot be null"

在这种情况下,您可能希望在bean中为State提供一个stateId和一个stateName (并避免删除@NotNull注释):

代码语言:javascript
复制
state.setStateId(1);
state.setStateName("MyState");

最后,如果您还将country_id设置为非可选字段,如注释所示,那么在持久化它之前,还必须为您所在的州分配一个国家。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11772944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档