Java 无法接受@ID@generatedvalue JPA实体上的空值

Java 无法接受@ID@generatedvalue JPA实体上的空值,java,jakarta-ee,jpa,Java,Jakarta Ee,Jpa,我正在尝试为我的应用程序添加愿望列表功能,但不断出现以下错误: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLIntegrityConstraintViolationException

我正在尝试为我的应用程序添加愿望列表功能,但不断出现以下错误:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):           org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Column 'WISH_ID'        cannot accept a NULL value.
Error Code: -1
Call: INSERT INTO WISHLIST (BOOK_TITLE, CUSTOMER_ID) VALUES (?, ?)
bind => [2 parameters bound]
Query: InsertObjectQuery(dukesbookstore.entity.Wishlist[ wishId=null ])
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):   org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Table/View 'SEQUENCE' does not exist.
Error Code: -1
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [2 parameters bound]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")
root cause

java.sql.SQLSyntaxErrorException: Table/View 'SEQUENCE' does not exist.
root cause

org.apache.derby.client.am.SqlException: Table/View 'SEQUENCE' does not exist.
实体类:

@Entity
@Table(name = "WISHLIST")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Wishlist.findByCustomerId", query = "SELECT w FROM Wishlist w WHERE  w.customerId = :customerId"),

})
public class Wishlist implements Serializable
{
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name = "WISH_ID")
private Integer wishId;
@Column(name = "CUSTOMER_ID")
private Integer customerId;
@Size(max = 35)
@Column(name = "BOOK_TITLE")
private String bookTitle;

public Wishlist()
{
}



public Integer getCustomerId()
{
    return customerId;
}

public void setCustomerId(Integer customerId)
{
    this.customerId = customerId;
}

public String getBookTitle()
{
    return bookTitle;
}

public void setBookTitle(String bookTitle)
{
    this.bookTitle = bookTitle;
}   
}
这是创建新愿望的代码:

public void createWishlist(String title,int cust_id)
{
            Wishlist newWish = new Wishlist();
            newWish.setBookTitle(title);
            newWish.setCustomerId(cust_id);
            em.persist(newWish);
  }
我试图研究其他类似的问题,但它们涉及到我没有使用的hibernate。我也尝试过各种生成策略,如
AUTO
SEQUENCE
TABLE
,但都失败了。我还有另一个名为customer的实体,虽然它是从表单创建的,但运行良好

更改为
AUTO
会产生此错误:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):           org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Column 'WISH_ID'        cannot accept a NULL value.
Error Code: -1
Call: INSERT INTO WISHLIST (BOOK_TITLE, CUSTOMER_ID) VALUES (?, ?)
bind => [2 parameters bound]
Query: InsertObjectQuery(dukesbookstore.entity.Wishlist[ wishId=null ])
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):   org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Table/View 'SEQUENCE' does not exist.
Error Code: -1
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [2 parameters bound]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")
root cause

java.sql.SQLSyntaxErrorException: Table/View 'SEQUENCE' does not exist.
root cause

org.apache.derby.client.am.SqlException: Table/View 'SEQUENCE' does not exist.
与案例相关的Persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="myStorePU" transaction-type="JTA">
    <jta-data-source>mydb</jta-data-source>
    <class>myStore.entity.Book</class>
    <class>myStore.entity.Customer</class>
    <class>myStore.entity.Wishlist</class>

    <properties>
        <property name="javax.persistence.jdbc.user" value="APP"/>
        <property name="javax.persistence.jdbc.password" value="APP"/>

         <property name="eclipselink.logging.level" value="FINE"/>
    </properties>

</persistence-unit>

mydb
myStore.entity.Book
myStore.entity.Customer
myStore.entity.Wishlist

现在终于开始工作了

首先,我必须删除从netbeans db创建工具创建的表,该工具的创建代码如下所示,如使用“抓取结构”所示

其次,我将此代码添加到persistence.xml文件中

<property name="eclipselink.ddl-generation" value="create-tables"/>
所以,基本上应该让netbeans从实体创建表本身,但我使用了“从表创建实体”功能,因为我必须首先在netbeans gui中创建表

谢谢@Geziefer的帮助,我也从你的帮助中学到了很多。

这可能是一个好消息。具体说明可能会有所帮助,但不会造成伤害

@JoinTable(name = "[some join table name]",
    joinColumns = {@JoinColumn(name = "[some ID column name]")},
    inverseJoinColumns = {@JoinColumn(name = "[some different ID column name]")})

您使用的底层数据库是什么?关于ID生成,这有所不同,例如Oracle不支持GenerationType.IDENTITY。我知道你说过,你尝试过其他方法,但为了正确使用它,这可能很重要。也许对你有帮助?在那篇文章中,他解决了这个问题,在使用标识生成之前删除了一个部署了实体类的旧jar,但我如何找到那个旧jar?所以我也可以删除它。这取决于您在应用程序部署中使用的内容。通常,您的应用程序服务器有一个部署文件夹,您的应用程序可以进入该文件夹,例如在JBoss中,在JBoss/server/default/deploy中使用默认值。