Jpa 持久化OneToMany实体会产生javax.faces.el.EvaluationException:javax.ejb.EJBException
当我尝试save方法时,它会给我一个错误,但是当我尝试手动将数据直接插入数据库时,它工作正常。请问在我的managedbean类中是否有我没有添加或看到的内容?请帮助保持解释尽可能简单明了。谢谢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 =
@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");