【问题标题】:java.sql.SQLIntegrityConstraintViolationException: Column 'ITEM_QTY' cannot accept a NULL valuejava.sql.SQLIntegrityConstraintViolationException:列 'ITEM_QTY' 不能接受 NULL 值
【发布时间】:2018-08-29 03:58:12
【问题描述】:

我正在使用 JPA API,它运行良好,我尝试向类添加新成员/列,当我尝试使用表单向其中添加数据时,它显示“TRANSACTION ABORTED”错误。

"javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Column 'ITEM_QTY'  cannot accept a NULL value.
Error Code: 20000
Call: INSERT INTO ITEM (B_ID, DESCRIPTION, ITEM_NAME, ITEM_PRICE, MANUFACTURER, DTYPE) VALUES (?, ?, ?, ?, ?, ?)
bind => [6 parameters bound]"

这个错误显示在 glassfish 日志中

这些是我生成的实体 item_.java

package Entities;

import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@Generated(value="EclipseLink-2.5.2.v20140319-rNA", date="2018-03-20T16:09:40")
@StaticMetamodel(Item.class)
public class Item_ { 

    public static volatile SingularAttribute<Item, Long> item_id;
    public static volatile SingularAttribute<Item, Long> b_id;
    public static volatile SingularAttribute<Item, Double> item_price;
    public static volatile SingularAttribute<Item, String> description;
    public static volatile SingularAttribute<Item, String> item_name;
    public static volatile SingularAttribute<Item, String> manufacturer;

}

和 Scarf.java

package Entities;

import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@Generated(value="EclipseLink-2.5.2.v20140319-rNA", date="2018-03-20T16:09:40")
@StaticMetamodel(Scarf.class)
public class Scarf_ extends Item_ {

    public static volatile SingularAttribute<Scarf, Long> t_id;
    public static volatile SingularAttribute<Scarf, Double> final_price;
    public static volatile SingularAttribute<Scarf, Double> discount;

}

EJB 的

Item.java

/*

package Entities;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * Creates Item Superclass Object
 * @author josh
 */
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item  implements Serializable {

    // Attributes
        public static final String ITEM = "Item.findAllItems";
    private static final long serialVersionUID = 1L;

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long item_id;
    @Column(nullable = true)
    public Long b_id;
    @Column(nullable = true)
    public String manufacturer;
    @Column(nullable = true)
    public String item_name;
    @Size(max = 2000)
    @Column(length = 2000)
    public String description;
    @Column(nullable = true)
    public double item_price;

    /**
     * Empty Constructor
     */
    public Item() {
    }

    /**
     * Constructor with Data
     * @param b_id
     * @param item_name
     * @param manufacturer
     * @param description
     * @param item_price
     */
    public Item(long b_id ,String item_name, String manufacturer, String description, double item_price) 
    {
        this.b_id = b_id;
        this.item_name = item_name;
        this.manufacturer = manufacturer;
        this.description = description;
        this.item_price = item_price;

    }

    /**
     * Get and Set Methods
     * @return 
     */    
    public Long getId() {
        return item_id;
    }

    public void setId(Long i) {
        this.item_id = i;
    }

    public Long getB_id() {
        return b_id;
    }

    public void setB_id(Long i) {
        this.b_id = i;
    }

    public String getItem_name() {
        return item_name;
    }

    public void setItem_name(String i) {
        this.item_name = i;
    }

    public String getManufacturer() {
        return manufacturer;
    }

    public void setManufacturer(String m) {
        this.manufacturer = m;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String d) {
        this.description = d;
    }

    public double getItem_price() {
        return item_price;
    }

    public void setItem_price(double i) {
        this.item_price = i;
    }

    /**
     * Search Methods
     */  
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (item_id != null ? item_id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Item)) {
            return false;
        }
        Item other = (Item) o;
        if ((this.item_id == null && other.item_id != null) || (this.item_id != null && !this.item_id.equals(other.item_id))) {
            return false;
        }
        return true;
    }

    /**
     * ToString Override Method
     * */
    @Override
    public String toString() {
        return String.format (
       "%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n",
            "Barcode: ",Long.toString(b_id),
            "Item Name: ",this.item_name,
            "Manufacturer: ",this.manufacturer, 
            "Item Price: ",Double.toString(item_price),
            "Category: ",this.description
        );
    } 
}

围巾.java

/*

package Entities;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.validation.constraints.NotNull;

/**
 * Creates Scarf Subclass Object
 *
 */
@Entity
public class Scarf extends Item implements Serializable 
{

    // Attributes
    public static final String SCARFS = "Scarf.findAllScarfs";
    private static final long serialVersionUID = 1L;

    @Column(nullable = true)
    public long t_id;
    @Column(nullable = true)
    public double discount;
    @Column(nullable = true)
    public double final_price;


    /**
     * Empty Constructor
     */
    public Scarf() {
    }

    /**
     * Constructor with Data
     * @param b_id
     * @param item_name
     * @param manufacturer
     * @param description
     * @param item_price
     * @param t_id
     * @param discount
     * @param final_price

     */
    public Scarf(long b_id, String item_name, String manufacturer, String description, double item_price, double discount, double final_price) 
    {
        super(b_id, item_name, manufacturer, description, item_price);
        this.t_id = t_id;
        this.discount = discount;
        this.final_price = final_price;
    }

    /**
     * Get and Set Methods
     *
     * @return
     */

     public Long getT_id() {
        return t_id;
    }

    public void setT_id(Long i) {
        this.t_id = i;
    }

    public double getDiscount() {
        return discount;
    }

    public void setDiscount(double i) {
        this.discount = i;
    }

    public double getFinal_price() {
        return final_price;
    }

    public void setFinal_price(double i) {
        this.final_price = i;
    }

    /**
     * ToString Override Method
     */
    @Override
    public String toString() {
        return String.format(
                "%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n",
                "Item ID: ", Long.toString(this.item_id),
                "Barcode: ", Long.toString(this.b_id),
                "Item Name: ", this.item_name,
                "Manufacturer: ", this.manufacturer,
                "Description: ", this.description,
                "Item Price: ", Double.toString(item_price),
                "Tag ID: ", Long.toString(this.t_id),
                "Discount: ", Double.toString(discount),
                "Final Price: ", Double.toString(final_price)

        );
    }

}

创建.xhtml

<h:panelGroup id="messagePanel" layout="block">
                <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/>
            </h:panelGroup>

            <!--Create panel-->
            <h:form>
                <h:panelGrid columns="2">

                    <h:outputLabel value="Barcode" for="b_id" />
                    <h:inputText id="b_id" value="#{scarfController.selected.b_id}" title="Barcode" required="false" requiredMessage="#{bundle.RequiredMessage}"/>
                    <h:outputLabel value="Item Name" for="item_name" />
                    <h:inputText id="item_name" value="#{scarfController.selected.item_name}" title="Item Name" required="true" requiredMessage="#{bundle.RequiredMessage}"/>
                    <h:outputLabel value="Manufacturer" for="manufacturer" />
                    <h:inputText id="manufacturer" value="#{scarfController.selected.manufacturer}" title="Manufacturer" required="false" requiredMessage="#{bundle.RequiredMessage}"/>
                    <h:outputLabel value="Category" for="description" />
                    <h:inputText id="description" value="#{scarfController.selected.description}" title="Description" required="false" requiredMessage="#{bundle.RequiredMessage}"/>
                    <h:outputLabel value="Price" for="item_price" />
                    <h:inputText id="item_price" value="#{scarfController.selected.item_price}" title="Price" required="false" requiredMessage="#{bundle.RequiredMessage}"/>
                    <h:outputLabel value="Tag Barcode" for="t_id" />
                    <h:inputText id="t_id" value="#{scarfController.selected.t_id}" title="Tag Barcode" required="false" requiredMessage="#{bundle.RequiredMessage}"/>
                    <h:outputLabel value="Discount" for="discount" />
                    <h:inputText id="discount" value="#{scarfController.selected.discount}" title="Discount" required="false" requiredMessage="#{bundle.RequiredMessage}"/>
                    <h:outputLabel value="Final Price" for="final_price" />
                    <h:inputText id="final_price" value="#{scarfController.selected.final_price}" title="Final Price" required="false" requiredMessage="#{bundle.RequiredMessage}"/>

                </h:panelGrid>
                 <br/> 
                <h:commandLink action="#{scarfController.persistScarf}" value="#{bundle.SaveLink}" />
                 <br /> 
             <a href="/home/" >Cancel</a>
            <br />

            </h:form>

添加属性后更新日志

Finer:   client acquired: 1783508080
Finer:   TX binding to tx mgr, status=STATUS_ACTIVE
Finer:   acquire unit of work: 2032803813
Finer:   TX afterCompletion callback, status=ROLLEDBACK
Finer:   release unit of work
Finer:   client released
Warning:   A system exception occurred during an invocation on EJB ScarfProducer, method: public void Beans.utility.Producer.create(java.lang.Object)
Warning:   javax.ejb.EJBException
    at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
    at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
    at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503)
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2044)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
    at com.sun.proxy.$Proxy233.create(Unknown Source)
    at Beans.__EJB31_Generated__ScarfProducer__Intf____Bean__.create(Unknown Source)
    at Beans.ScarfController.persistScarf(ScarfController.java:117)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:289)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
    at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 错误提到列 'ITEM_QTY' 为空,在您的代码或映射描述中的任何地方都没有提及。如果你没有映射它,JPA 就不能在里面放值。
  • 在这个项目中我正在重用代码我在代码中进行了修改并向类添加了一些属性,我还进行了所有更改以反映修改,ITEM_QTY 是我删除的旧类的属性,并且添加了我自己的属性我还删除了数据库并创建了新的但相同的错误,并且我使用 EclipseLink 作为持久性提供程序,所以请帮助解决这个问题
  • “删除数据库并创建新数据库”是什么意思?如果您收到相同的错误,则您创建了具有相同 ITEM_QTY 字段的同一个表。无论您使用什么来创建数据库和表,都需要考虑到您的新模型和映射。
  • 我们使用 eclipse 持久化 API 将类映射到数据库中,如果您看到上面的代码,我们已经根据需要更改了类,并且每次都出现问题并且更改的类没有映射到数据库中我们用旧映射清理构建它创建数据库的项目,所以我认为问题出在持久单元中
  • 浏览整个项目比我能做的要多一点,而且它没有显示任何东西,因为我看到里面没有提到 ITEM_QTY。您需要搜索您的项目并确保无论您在何处运行它,都不会在您的新版本之前拾取和加载一些旧的类文件。打开 EclipseLink 日志记录到 ALL 或 FINEST 以获得线索,因为它会显示 DDL 语句以及它从何处加载持久性单元,这将有助于追踪问题。

标签: java maven jpa eclipselink derby


【解决方案1】:

问题是您没有重建/重新部署您的 jar 文件。我可以看到它上次构建的时间是Dec 31 17:46:18 AEST 2015。在您的 .war 文件中,HatAndScarf\META-INF\maven\josh\Assignment2 中有一个文件公开了此信息:

#Generated by Maven
#Thu Dec 31 17:46:18 AEST 2015
version=1.0
groupId=josh
artifactId=Assignment2

我认为如果您尝试通过 maven 构建它然后重新部署它,问题应该会消失。

【讨论】:

  • 新 jar 未生成,我必须做什么
  • 我可以看到它是在您的“目标”文件夹下生成的,我错过了什么吗?只需将其部署到您的 tomcat(或其他应用程序服务器)。
  • 我正在使用 glassfish,我将相同的项目部署到 glassfish 但同样的问题
  • 能把新的jar上传到github吗?
  • 是的,我上传了新战争,这里是链接github.com/YogeshDoke/ESL-project/tree/yd
【解决方案2】:

更改您的数据库表以删除 ITEM_QTY 列上的非空约束。

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2020-10-30
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多