【问题标题】:Persisting a OneToMany Entity gives javax.faces.el.EvaluationException: javax.ejb.EJBException持久化 OneToMany 实体会产生 javax.faces.el.E​​valuationException: javax.ejb.EJBException
【发布时间】:2012-08-02 07:33:31
【问题描述】:

当我尝试保存方法时,它给了我一个错误,但是当我尝试手动将数据直接插入数据库时​​,它工作正常。请问在我的 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;
}

托管豆

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);
    }        
}

错误页面

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)

【问题讨论】:

    标签: jpa persistence ejb jpa-2.0 one-to-many


    【解决方案1】:

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

    删除stateIdstateName 字段的@NotNull 注释会有所帮助,但您可能会从数据库中得到另一个异常。只是给你一个想法,如果你的IDE已经自动生成了@NotNull注解,这可能是由于db表中的字段定义造成的。如果这是您的情况,并且您正在使用像我这样的 MySql 数据库,您将得到:

    Internal Exception: java.sql.SQLException: Duplicate key or integrity constraint violation message from server: "Column 'state_id' cannot be null"
    

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

    state.setStateId(1);
    state.setStateName("MyState");
    

    最后,如果您还将country_id 设置为非可选字段,就像注释所建议的那样,您还必须在持久化之前为您的州分配一个国家/地区。

    【讨论】:

    • 谢谢 perissf,我会试试你的建议。
    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多