0

save メソッドを試すとエラーが発生しますが、データベースに直接データを手動で挿入しようとすると正常に動作します。マネージド Bean クラスに追加されていない、または表示されていないものがありますか? 説明をできるだけシンプルかつストレートに保つためにご協力ください。ありがとう

@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)
4

1 に答える 1

0

例外ログに明確に示されているように、がありますConstraintViolationException。あなたの場合、例外はあなたの実装のメソッド@NotNullによって生成されたアノテーションによって引き起こされます。PrePersistJPA

およびフィールドの@NotNull注釈を削除すると役立ちますが、データベースから別の例外が発生する可能性があります。念のために言っておきますが、注釈がIDEによって自動的に生成された場合、これはおそらくdbテーブルのフィールド定義が原因です。これがあなたのケースであり、私のようなMySqlデータベースを使用している場合は、次のようになります。stateIdstateName@NotNull

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

この場合、おそらくBeanの状態にstateIdとを指定する必要があります(アノテーションの削除は避けてください)。stateName@NotNull

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

最後に、country_id注釈が示すように、オプションではないフィールドとしても設定した場合は、それを永続化する前に、国も州に割り当てる必要があります。

于 2012-08-02T19:41:29.183 に答える