2009-12-17 54 views
0

我正在使用JPA處理數據庫備份引擎。一切工作正常,但我有問題解決這個問題。我知道與我如何定義實體有關。使用JPA備份數據庫

首先這裏的系統是如何工作的一個簡短:

  1. 在選定的目錄
  2. 連接到源數據庫中創建一個Derby數據庫實例和scrol通表獲取所有實體和它們複製到目標數據庫(Derby實例)
  3. 壓縮目標數據庫並存儲壓縮文件。

要恢復基本解壓縮數據庫,並進行備份的源和現場分貝目標

一切工作正常,直到我發現我離開了(刪除在新的目標數據庫的所有實體之後)來自備份的表格。當我將它它具有以下抱怨:

javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.0.v20091127-r5931): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`xinco`.`xinco_core_ace`, CONSTRAINT `FK_xinco_core_ace_xinco_core_user_id` FOREIGN KEY (`xinco_core_user_id`) REFERENCES `xinco_core_user` (`id`)) 
Error Code: 1451 
Call: DELETE FROM xinco_core_user WHERE (id = ?) 
     bind => [1] 

這裏的實體,我複製時出現錯誤:

package com.bluecubs.xinco.core.server.persistence; 

import com.bluecubs.xinco.core.server.AuditedEntityListener; 
import com.bluecubs.xinco.core.server.XincoAuditedObject; 
import java.io.Serializable; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.EntityListeners; 
import javax.persistence.FetchType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 
import javax.persistence.CascadeType; 

/** 
* 
* @author Javier A. Ortiz Bultrón <[email protected]> 
*/ 
@Entity 
@Table(name = "xinco_core_ace") 
@EntityListeners(AuditedEntityListener.class) 
@NamedQueries({ 
    @NamedQuery(name = "XincoCoreAce.findAll", 
    query = "SELECT x FROM XincoCoreAce x"), 
    @NamedQuery(name = "XincoCoreAce.findById", 
    query = "SELECT x FROM XincoCoreAce x WHERE x.id = :id"), 
    @NamedQuery(name = "XincoCoreAce.findByReadPermission", 
    query = "SELECT x FROM XincoCoreAce x WHERE x.readPermission = :readPermission"), 
    @NamedQuery(name = "XincoCoreAce.findByWritePermission", 
    query = "SELECT x FROM XincoCoreAce x WHERE x.writePermission = :writePermission"), 
    @NamedQuery(name = "XincoCoreAce.findByExecutePermission", 
    query = "SELECT x FROM XincoCoreAce x WHERE x.executePermission = :executePermission"), 
    @NamedQuery(name = "XincoCoreAce.findByAdminPermission", 
    query = "SELECT x FROM XincoCoreAce x WHERE x.adminPermission = :adminPermission")}) 
public class XincoCoreAce extends XincoAuditedObject implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "id", nullable = false) 
    private Integer id; 
    @Basic(optional = false) 
    @Column(name = "read_permission", nullable = false) 
    private boolean readPermission; 
    @Basic(optional = false) 
    @Column(name = "write_permission", nullable = false) 
    private boolean writePermission; 
    @Basic(optional = false) 
    @Column(name = "execute_permission", nullable = false) 
    private boolean executePermission; 
    @Basic(optional = false) 
    @Column(name = "admin_permission", nullable = false) 
    private boolean adminPermission; 
    @JoinColumn(name = "xinco_core_data_id", referencedColumnName = "id", nullable = true) 
    @ManyToOne(fetch = FetchType.LAZY) 
    private XincoCoreData xincoCoreDataId; 
    @JoinColumn(name = "xinco_core_group_id", referencedColumnName = "id", nullable = true) 
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) 
    private XincoCoreGroup xincoCoreGroupId; 
    @JoinColumn(name = "xinco_core_node_id", referencedColumnName = "id", nullable = true) 
    @ManyToOne(fetch = FetchType.LAZY) 
    private XincoCoreNode xincoCoreNodeId; 
    @JoinColumn(name = "xinco_core_user_id", referencedColumnName = "id", nullable = true) 
    @ManyToOne(fetch = FetchType.LAZY) 
    private XincoCoreUser xincoCoreUserId; 

    public XincoCoreAce() { 
    } 

    public XincoCoreAce(Integer id) { 
     this.id = id; 
    } 

    public XincoCoreAce(Integer id, boolean readPermission, boolean writePermission, boolean executePermission, boolean adminPermission) { 
     this.id = id; 
     this.readPermission = readPermission; 
     this.writePermission = writePermission; 
     this.executePermission = executePermission; 
     this.adminPermission = adminPermission; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public boolean getReadPermission() { 
     return readPermission; 
    } 

    public void setReadPermission(boolean readPermission) { 
     this.readPermission = readPermission; 
    } 

    public boolean getWritePermission() { 
     return writePermission; 
    } 

    public void setWritePermission(boolean writePermission) { 
     this.writePermission = writePermission; 
    } 

    public boolean getExecutePermission() { 
     return executePermission; 
    } 

    public void setExecutePermission(boolean executePermission) { 
     this.executePermission = executePermission; 
    } 

    public boolean getAdminPermission() { 
     return adminPermission; 
    } 

    public void setAdminPermission(boolean adminPermission) { 
     this.adminPermission = adminPermission; 
    } 

    public XincoCoreData getXincoCoreDataId() { 
     return xincoCoreDataId; 
    } 

    public void setXincoCoreDataId(XincoCoreData xincoCoreDataId) { 
     this.xincoCoreDataId = xincoCoreDataId; 
    } 

    public XincoCoreGroup getXincoCoreGroupId() { 
     return xincoCoreGroupId; 
    } 

    public void setXincoCoreGroupId(XincoCoreGroup xincoCoreGroupId) { 
     this.xincoCoreGroupId = xincoCoreGroupId; 
    } 

    public XincoCoreNode getXincoCoreNodeId() { 
     return xincoCoreNodeId; 
    } 

    public void setXincoCoreNodeId(XincoCoreNode xincoCoreNodeId) { 
     this.xincoCoreNodeId = xincoCoreNodeId; 
    } 

    public XincoCoreUser getXincoCoreUserId() { 
     return xincoCoreUserId; 
    } 

    public void setXincoCoreUserId(XincoCoreUser xincoCoreUserId) { 
     this.xincoCoreUserId = xincoCoreUserId; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof XincoCoreAce)) { 
      return false; 
     } 
     XincoCoreAce other = (XincoCoreAce) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "com.bluecubs.xinco.core.server.persistence.XincoCoreAce[id=" + id + "]"; 
    } 
} 

我試圖改變級聯型爲xincoCoreDataId,但它沒」工作。我會繼續努力,但歡迎任何反饋。

編輯: 似乎我複製了錯誤的異常。抱歉。

下面是實際的異常

javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.0.v20091127-r5931): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL091217135308520' defined on 'XINCO_CORE_GROUP'. 
Error Code: 20000 
Call: INSERT INTO xinco_core_group (id, designation, status_number) VALUES (?, ?, ?) 
     bind => [1, general.group.admin, 1] 

回答

0

找到了!我必須從xincoCoreGroupId中刪除CascadeType.PERSISTENCE。在對我的帖子寫下我的評論後發現這個。

0

我在這裏看到的是數據庫阻止您刪除這是由另一臺使用外鍵約束引用的記錄。具體來說,它看起來像表xinco_core_ace有一個名爲xinco_core_user_id的列,它是您的xinco_core_user表中的外鍵。

除非首先刪除xinco_core_ace中的行(參照完整性),否則不能刪除該用戶對象。

您可以在您的JPA映射中將此更改爲從您的用戶對象級聯DELETE到您的XincoCoreAce對象如果這是您想要的

+0

檢查初始文章中的編輯。 這是我複製到新數據庫的最後一張表,XincoCoreGroup已經被複制過了。我試圖找出爲什麼添加XincoCoreAce實體試圖再次創建XincoCoreGroups。 – javydreamercsw 2009-12-17 20:01:31