当我尝试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;
}ManagedBean
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)发布于 2012-08-03 03:41:29
正如异常日志清楚地指出的那样,您拥有一个ConstraintViolationException。在本例中,异常是由@NotNull注释引起的,该注释是由JPA实现中的PrePersist方法生成的。
删除stateId和stateName字段的@NotNull注释会有所帮助,但您的数据库可能会出现另一个异常。让您了解一下,如果@NotNull注释是由您的集成开发环境自动生成的,这可能是由于数据库表中的字段定义造成的。如果这是您的情况,并且您使用的是像我一样的MySql数据库,那么您将得到:
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注释):
state.setStateId(1);
state.setStateName("MyState");最后,如果您还将country_id设置为非可选字段,如注释所示,那么在持久化它之前,还必须为您所在的州分配一个国家。
https://stackoverflow.com/questions/11772944
复制相似问题