Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenJPA级联使用@EmbeddedId保持一对多_Java_Jpa_One To Many_Openjpa - Fatal编程技术网

Java OpenJPA级联使用@EmbeddedId保持一对多

Java OpenJPA级联使用@EmbeddedId保持一对多,java,jpa,one-to-many,openjpa,Java,Jpa,One To Many,Openjpa,我拥有以下实体: 发票 @Entity @Table(name = "invoice") public class Invoice implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "InvoiceID") priva

我拥有以下实体:

发票

@Entity
@Table(name = "invoice")
public class Invoice implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "InvoiceID")
    private Long invoiceID;

    @Basic(optional = false)
    @Column(name = "Date")
    @Temporal(TemporalType.DATE)
    private Date date;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "invoice")
    private List<Invoiceitem> invoiceitemCollection;

    @JoinColumn(name = "CustomerID", referencedColumnName = "CustomerID")
    @ManyToOne(fetch = FetchType.LAZY,optional = false)
    private Customer customerID;

    // getter/setter
}
InvoiceItemPK

@Embeddable
public class InvoiceitemPK implements Serializable {

    @Column(name = "ItemID" ,nullable=false)
    private long itemID;

    @Column(name = "InvoiceID", nullable=false)
    private long invoiceID;

    // getter/setter
}
这是一个三层独立应用程序,我需要执行以下操作: 测试1。对于10张发票中的每一张,添加10张发票项 ....

步骤1,填写发票-发票项目:

for(int i = 0; i < invoiceNumber; i++ ){
 // set invoice where invoiceNumber = 10, 100
        Invoice invoice = new Invoice();
        String formatIn = "dd-MM-yyyy";
        SimpleDateFormat sdfi = new SimpleDateFormat(formatIn);
        java.util.Date inDate = sdfi.parse("29-04-2011");
        java.sql.Date sqlDate = new java.sql.Date(inDate.getTime());

        invoice.setCustomerID(newCust);
        invoice.setDate(sqlDate);
        // set Invoiceitem
        setInvoiceItem(prod, invItemNumber, invoice);

        saveInvoice(invoice);

}
步骤2,发票服务

public String save(Invoice invoice) {
InvoiceDAO.log("saving Invoice---> InvoiceItem instance", Level.INFO, null);
    try {
        inDAO.beginTransaction();
    inDAO.insert(invoice);

        for (int i = 0; i < invoice.getInvoiceitemCollection().size(); i++) {
            InvoiceitemPK inItmPK = new InvoiceitemPK();

            inItmPK.setItemID(++i);
            inItmPK.setInvoiceID(invoice.getInvoiceID());

            invoice.getInvoiceitemCollection().get(i).setInvoiceitemPK(inItmPK);

       for (int i = 0; i < invoice.getInvoiceitemCollection().size(); i++) {
            inDAO.insert(invoice);

            }
          inDAO.commitTransaction();
    } catch (Exception e) {
        InvoiceDAO.log("save failed", Level.SEVERE, e);
        return "Invoice  are't  saved";
    }
    inDAO.closeEntityManager();
    InvoiceDAO.log("save successful", Level.INFO, null);
    return "Invoice successfuly saved";
}
公共字符串保存(发票){
log(“保存发票-->InvoiceItem实例”,Level.INFO,空);
试一试{
inDAO.beginTransaction();
插入(发票);
对于(int i=0;i
正在运行的应用程序是通过以下错误获取的: 1.org.apache.openjpa.persistence.ArgumentException:尝试将id“domainopenjpa.Invoiceitem null”分配给新实例“domainopenjpa”。Invoiceitem@4fdf11“失败; 2.org.apache.openjpa.persistence.ArgumentException:无法设置值

将发票持久保存到数据库中的最佳方法是什么? 我在哪里做的​​一个错误,如何纠正

嗨,瑞克

异常堆栈如下所示:

<openjpa-2.0.1-r422266:989424 fatal general error> org.apache.openjpa.persistence.PersistenceException: This operation failed for some instances.  See the nested exceptions array for details.
    at org.apache.openjpa.kernel.BrokerImpl.throwNestedExceptions(BrokerImpl.java:2493)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2179)
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1808)
    at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:609)
    at org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:696)
    at org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1608)
    at org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591)
    at domainopenjpa.Invoice.pcGetinvoiceID(Invoice.java)
...
Caused by: <openjpa-2.0.1-r422266:989424 fatal general error> org.apache.openjpa.persistence.PersistenceException: The transaction has been rolled back.  See the nested exceptions for details on the errors that occurred.
    at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2302)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2139)
    ... 77 more
Caused by: <openjpa-2.0.1-r422266:989424 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: cant-set-value
    at org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.insert(HandlerFieldStrategy.java:132)
    at org.apache.openjpa.jdbc.meta.FieldMapping.insert(FieldMapping.java:623)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.insert(AbstractUpdateManager.java:230)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.populateRowManager(AbstractUpdateManager.java:162)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:95)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76)
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:731)
    at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
    ... 78 more
NestedThrowables:
<openjpa-2.0.1-r422266:989424 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Attempt to assign id "domainopenjpa.Invoiceitem-null" to new instance "domainopenjpa.Invoiceitem@4fdf11" failed; there is already an object in the L1 cache with this id. You must delete this object (in a previous transaction or the current one) before reusing its id.  This error can also occur when a horizontally or vertically mapped classes uses auto-increment application identity and does not use a hierarchy of application identity classes.
FailedObject: domainopenjpa.Invoiceitem@4fdf11
at org.apache.openjpa.kernel.ManagedCache.assignObjectId(ManagedCache.java:193)
    at org.apache.openjpa.kernel.BrokerImpl.assignObjectId(BrokerImpl.java:4949)
    at org.apache.openjpa.kernel.BrokerImpl.setStateManager(BrokerImpl.java:4046)
    at org.apache.openjpa.kernel.StateManagerImpl.assertObjectIdAssigned(StateManagerImpl.java:636)
    at org.apache.openjpa.kernel.StateManagerImpl.afterFlush(StateManagerImpl.java:1084)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2162)
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1808)
    at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:609)
    at org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:696)
    at org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1608)
    at org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591)
    at domainopenjpa.Invoice.pcGetinvoiceID(Invoice.java)
    at domainopenjpa.Invoice.getInvoiceID(Invoice.java:64)
org.apache.openjpa.persistence.PersistenceException:此操作在某些实例中失败。有关详细信息,请参阅嵌套异常数组。
位于org.apache.openjpa.kernel.BrokerImpl.throwNestedExceptions(BrokerImpl.java:2493)
位于org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2179)
位于org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
位于org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1808)
位于org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:609)
位于org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:696)
位于org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1608)
位于org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591)
在domainopenjpa.Invoice.pcGetinvoiceID(Invoice.java)上
...
原因:org.apache.openjpa.persistence.PersistenceException:事务已回滚。有关发生的错误的详细信息,请参阅嵌套异常。
位于org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2302)
位于org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2139)
…还有77个
原因:org.apache.openjpa.persistence.ArgumentException:无法设置值
位于org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.insert(HandlerFieldStrategy.java:132)
位于org.apache.openjpa.jdbc.meta.FieldMapping.insert(FieldMapping.java:623)
位于org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.insert(AbstractUpdateManager.java:230)
位于org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.populateRowManager(AbstractUpdateManager.java:162)
位于org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:95)
位于org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76)
位于org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:731)
位于org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
…还有78个
嵌套的工作流表:
org.apache.openjpa.persistence.ArgumentException:尝试将id“domainopenjpa.Invoiceitem null”分配给新实例“domainopenjpa”。Invoiceitem@4fdf11“失败;一级缓存中已存在具有此id的对象。必须删除此对象(在以前的事务或当前事务中)在重用其id之前。当水平或垂直映射的类使用自动增量应用程序标识而不使用应用程序标识类的层次结构时,也可能发生此错误。
失败对象:domainopenjpa。Invoiceitem@4fdf11
位于org.apache.openjpa.kernel.ManagedCache.assignObjectId(ManagedCache.java:193)
位于org.apache.openjpa.kernel.BrokerImpl.assignObjectId(BrokerImpl.java:4949)
位于org.apache.openjpa.kernel.BrokerImpl.setStateManager(BrokerImpl.java:4046)
位于org.apache.openjpa.kernel.StateManagerImpl.assertObjectIdAssigned(StateManagerImpl.java:636)
位于org.apache.openjpa.kernel.StateManagerImpl.afterFlush(StateManagerImpl.java:1084)
位于org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2162)
位于org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
位于org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1808)
位于org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:609)
位于org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:696)
位于org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1608)
位于org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591)
在domainopenjpa.Invoice.pcGetinvoiceID(Invoice.java)上
在domainopenjpa.Invoice.getInvoiceID(Invoice.java:64)上
新异常堆栈:

<openjpa-2.0.1-r422266:989424 fatal user error> org.apache.openjpa.persistence.InvalidStateException: Encountered unmanaged object in persistent field "domainopenjpa.Invoice.invoiceitemCollection<element:class domainopenjpa.Invoiceitem>" during flush.  However, this field does not allow cascade persist. Set the cascade attribute for this field to CascadeType.PERSIST or CascadeType.ALL (JPA annotations) or "persist" or "all" (JPA orm.xml), or enable cascade-persist globally, or manually persist the related field value prior to flushing. You cannot flush unmanaged objects or graphs that have persistent associations to unmanaged objects.
FailedObject: domainopenjpa.Invoiceitem@939bdb
org.apache.openjpa.persistence.InvalidStateException:在刷新期间在持久字段“domainopenjpa.Invoice.invoiceitemCollection”中遇到非托管对象。但是,此字段不允许级联持久化。请将此字段的级联属性设置为CascadeType.persist或CascadeType.ALL(JPA注释)或“persist”或“ALL”
public String save(Invoice invoice) {
InvoiceDAO.log("saving Invoice---> InvoiceItem instance", Level.INFO, null);
    try {
        inDAO.beginTransaction();
    inDAO.insert(invoice);

        for (int i = 0; i < invoice.getInvoiceitemCollection().size(); i++) {
            InvoiceitemPK inItmPK = new InvoiceitemPK();

            inItmPK.setItemID(++i);
            inItmPK.setInvoiceID(invoice.getInvoiceID());

            invoice.getInvoiceitemCollection().get(i).setInvoiceitemPK(inItmPK);

       for (int i = 0; i < invoice.getInvoiceitemCollection().size(); i++) {
            inDAO.insert(invoice);

            }
          inDAO.commitTransaction();
    } catch (Exception e) {
        InvoiceDAO.log("save failed", Level.SEVERE, e);
        return "Invoice  are't  saved";
    }
    inDAO.closeEntityManager();
    InvoiceDAO.log("save successful", Level.INFO, null);
    return "Invoice successfuly saved";
}
<openjpa-2.0.1-r422266:989424 fatal general error> org.apache.openjpa.persistence.PersistenceException: This operation failed for some instances.  See the nested exceptions array for details.
    at org.apache.openjpa.kernel.BrokerImpl.throwNestedExceptions(BrokerImpl.java:2493)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2179)
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1808)
    at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:609)
    at org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:696)
    at org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1608)
    at org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591)
    at domainopenjpa.Invoice.pcGetinvoiceID(Invoice.java)
...
Caused by: <openjpa-2.0.1-r422266:989424 fatal general error> org.apache.openjpa.persistence.PersistenceException: The transaction has been rolled back.  See the nested exceptions for details on the errors that occurred.
    at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2302)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2139)
    ... 77 more
Caused by: <openjpa-2.0.1-r422266:989424 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: cant-set-value
    at org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.insert(HandlerFieldStrategy.java:132)
    at org.apache.openjpa.jdbc.meta.FieldMapping.insert(FieldMapping.java:623)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.insert(AbstractUpdateManager.java:230)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.populateRowManager(AbstractUpdateManager.java:162)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:95)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76)
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:731)
    at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
    ... 78 more
NestedThrowables:
<openjpa-2.0.1-r422266:989424 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Attempt to assign id "domainopenjpa.Invoiceitem-null" to new instance "domainopenjpa.Invoiceitem@4fdf11" failed; there is already an object in the L1 cache with this id. You must delete this object (in a previous transaction or the current one) before reusing its id.  This error can also occur when a horizontally or vertically mapped classes uses auto-increment application identity and does not use a hierarchy of application identity classes.
FailedObject: domainopenjpa.Invoiceitem@4fdf11
at org.apache.openjpa.kernel.ManagedCache.assignObjectId(ManagedCache.java:193)
    at org.apache.openjpa.kernel.BrokerImpl.assignObjectId(BrokerImpl.java:4949)
    at org.apache.openjpa.kernel.BrokerImpl.setStateManager(BrokerImpl.java:4046)
    at org.apache.openjpa.kernel.StateManagerImpl.assertObjectIdAssigned(StateManagerImpl.java:636)
    at org.apache.openjpa.kernel.StateManagerImpl.afterFlush(StateManagerImpl.java:1084)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2162)
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1808)
    at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:609)
    at org.apache.openjpa.kernel.StateManagerImpl.assignField(StateManagerImpl.java:696)
    at org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1608)
    at org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591)
    at domainopenjpa.Invoice.pcGetinvoiceID(Invoice.java)
    at domainopenjpa.Invoice.getInvoiceID(Invoice.java:64)
<openjpa-2.0.1-r422266:989424 fatal user error> org.apache.openjpa.persistence.InvalidStateException: Encountered unmanaged object in persistent field "domainopenjpa.Invoice.invoiceitemCollection<element:class domainopenjpa.Invoiceitem>" during flush.  However, this field does not allow cascade persist. Set the cascade attribute for this field to CascadeType.PERSIST or CascadeType.ALL (JPA annotations) or "persist" or "all" (JPA orm.xml), or enable cascade-persist globally, or manually persist the related field value prior to flushing. You cannot flush unmanaged objects or graphs that have persistent associations to unmanaged objects.
FailedObject: domainopenjpa.Invoiceitem@939bdb
<openjpa-1.2.4-SNAPSHOT-r422266:1481680 nonfatal user error> 
org.apache.openjpa.persistence.ArgumentException: 
Field "com.server.beans.entities.BalanceDetail.id" of "BalanceDetail 
id=BalanceDetailPK [relevanceDate=........],
can not be set to "BalanceDetailPK [relevanceDate=........]" value.
               WHICH WAS THE SAME VALUE ..
@Column(name="RELEVANCE_DATE", insertable=false, updatable=false)
private java.util.Date relevanceDate;

@Column(name="FND_ID", insertable=false, updatable=false)
private Long fndId;
@Column(name="RELEVANCE_DATE")
private java.util.Date relevanceDate;

@Column(name="FND_ID")
private Long fndId;