2013-04-04 63 views
1

我有一些問題存儲條目到我的數據庫。我使用下面的層次結構:複製條目異常休眠

我有一個父類PageContent和兩個子類文本輸入和圖像。然而,當我嘗試存儲比PageContent實體多,我得到以下異常:

HTTP狀態500 - 請求處理失敗;嵌套的異常是org.springframework.dao.DataIntegrityViolationException:重複鍵入'groups_groupId'的條目'2'; SQL [n/a];約束[null];嵌套的例外是org.hibernate.exception.ConstraintViolationException:複製進入 '2' 關鍵 'groups_groupId'

下面是相關的類

Group.java:

package com.youthministry.domain; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 

@Entity(name="GROUP_DETAILS") 
public class Group { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long groupId; 
    @Column(name = "GROUP_NAME", unique = true, nullable = false) 
    private String groupName; 
    private String groupDesc; 

    /*public String getIdAsString() { 
     return new Long(groupId).toString(); 
    }*/ 
    public Long getGroupId() { 
     return groupId; 
    } 
    public void setGroupId(Long groupId) { 
     this.groupId = groupId; 
    } 
    public String getGroupName() { 
     return groupName; 
    } 
    public void setGroupName(String groupName) { 
     this.groupName = groupName; 
    } 
    public String getGroupDesc() { 
     return groupDesc; 
    } 
    public void setGroupDesc(String groupDesc) { 
     this.groupDesc = groupDesc; 
    } 

} 

PageContent.java

package com.youthministry.domain; 

import java.util.ArrayList; 
import java.util.Collection; 

import javax.persistence.CascadeType; 
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.persistence.OneToMany; 

@Entity 
@Inheritance (strategy=InheritanceType.JOINED) 
public class PageContent { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long pageContentId; 
    @Column(name="PAGE_CONTENT_NAME", nullable=false) 
    private String pageContentName; 
    @Column(name="LOCATION", nullable=false) 
    private String location; 

    @OneToMany(cascade=CascadeType.REMOVE) 
    private Collection<Group> groups = new ArrayList<Group>(); 

    public Long getPageContentId() { 
     return pageContentId; 
    } 
    public void setPageContentId(Long pageContentId) { 
     this.pageContentId = pageContentId; 
    } 
    public String getPageContentName() { 
     return pageContentName; 
    } 
    public void setPageContentName(String pageContentName) { 
     this.pageContentName = pageContentName; 
    } 
    public String getLocation() { 
     return location; 
    } 
    public void setLocation(String location) { 
     this.location = location; 
    } 
    public Collection<Group> getGroups() { 
     return groups; 
    } 
    public void setGroups(Collection<Group> groups) { 
     this.groups = groups; 
    } 

} 

Image.java

package com.youthministry.domain; 

import javax.persistence.Entity; 

@Entity 
public class Image extends PageContent { 
    private String pathToImage; 
    private String altText; 
    private String titleText; 

    public String getPathToImage() { 
     return pathToImage; 
    } 
    public void setPathToImage(String pathToImage) { 
     this.pathToImage = pathToImage; 
    } 
    public String getAltText() { 
     return altText; 
    } 
    public void setAltText(String altText) { 
     this.altText = altText; 
    } 
    public String getTitleText() { 
     return titleText; 
    } 
    public void setTitleText(String titleText) { 
     this.titleText = titleText; 
    } 

} 

TextEntry.java

package com.youthministry.domain; 

import javax.persistence.Entity; 
import javax.persistence.Lob; 

@Entity 
public class TextEntry extends PageContent { 

    private String contentTitle; 
    @Lob 
    private String contentBody; 

    public String getContentTitle() { 
     return contentTitle; 
    } 
    public void setContentTitle(String contentTitle) { 
     this.contentTitle = contentTitle; 
    } 
    public String getContentBody() { 
     return contentBody; 
    } 
    public void setContentBody(String contentBody) { 
     this.contentBody = contentBody; 
    } 

} 

我試圖解決這一點,我的直覺是,它與我使用的CascadeType的做,我原以爲它更改爲級聯刪除上,而不是雖然刪除了Group Entity的重複插入,但仍然收到上述異常。

這裏是鏈接到GIT回購: 提前http://github.com/dmcquillan314/YouthMinistryHibernate

任何幫助表示讚賞感謝。

這裏是所有相關的數據庫表的創建表腳本:

CREATE TABLE `PageContent_GROUP_DETAILS` (
    `PageContent_pageContentId` bigint(20) NOT NULL, 
    `groups_groupId` bigint(20) NOT NULL, 
    UNIQUE KEY `groups_groupId` (`groups_groupId`), 
    KEY `FK43215F8D912C9AF9` (`PageContent_pageContentId`), 
    KEY `FK43215F8D11E7050D` (`groups_groupId`), 
    CONSTRAINT `FK43215F8D11E7050D` FOREIGN KEY (`groups_groupId`) REFERENCES `GROUP_DETAILS` (`groupId`), 
    CONSTRAINT `FK43215F8D912C9AF9` FOREIGN KEY (`PageContent_pageContentId`) REFERENCES `PageContent` (`pageContentId`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `Image` (
    `altText` varchar(255) DEFAULT NULL, 
    `pathToImage` varchar(255) DEFAULT NULL, 
    `titleText` varchar(255) DEFAULT NULL, 
    `pageContentId` bigint(20) NOT NULL, 
    PRIMARY KEY (`pageContentId`), 
    KEY `FK437B93B4AAD3F6E` (`pageContentId`), 
    CONSTRAINT `FK437B93B4AAD3F6E` FOREIGN KEY (`pageContentId`) REFERENCES `PageContent` (`pageContentId`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `PageContent` (
    `pageContentId` bigint(20) NOT NULL AUTO_INCREMENT, 
    `LOCATION` varchar(255) NOT NULL, 
    `PAGE_CONTENT_NAME` varchar(255) NOT NULL, 
    PRIMARY KEY (`pageContentId`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 

CREATE TABLE `GROUP_DETAILS` (
    `groupId` bigint(20) NOT NULL AUTO_INCREMENT, 
    `groupDesc` varchar(255) DEFAULT NULL, 
    `GROUP_NAME` varchar(255) NOT NULL, 
    PRIMARY KEY (`groupId`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 
+0

刪除

UNIQUE KEY 'groups_groupId' ('groups_groupId'), 

什麼是分貝之下? – Thihara 2013-04-04 04:07:50

+0

@Thihara我已經使用create table scripts編輯了我的帖子。需要幫助請叫我。 – dmcqu314 2013-04-04 04:27:23

回答

2

您正在groups_groupId獨特。

PageContent類中的關係是OneToMany

在關係表中將如下所示。

PageContentID GroupID 
1    2 
1    1 
1    3 
2    1 
2    3 

因此,使這個關係表中唯一的列是一個否定的。

我的意思是什麼讓你從

CREATE TABLE `PageContent_GROUP_DETAILS` (
`PageContent_pageContentId` bigint(20) NOT NULL, 
`groups_groupId` bigint(20) NOT NULL, 
UNIQUE KEY `groups_groupId` (`groups_groupId`), 
KEY `FK43215F8D912C9AF9` (`PageContent_pageContentId`), 
KEY `FK43215F8D11E7050D` (`groups_groupId`), 
CONSTRAINT `FK43215F8D11E7050D` FOREIGN KEY (`groups_groupId`) REFERENCES `GROUP_DETAILS` (`groupId`), 
CONSTRAINT `FK43215F8D912C9AF9` FOREIGN KEY (`PageContent_pageContentId`) 
REFERENCES `PageContent` (`pageContentId`)) 
ENGINE=InnoDB DEFAULT CHARSET=latin1 
+0

該問題似乎來自groupId列。我做了你所建議的改變,我似乎仍然得到同樣的例外。我爲Hibernate啓用了showSQL標誌,它會生成以下查詢。Hibernate:插入到PageContent(LOCATION,PAGE_CONTENT_NAME)值(?,?) Hibernate:插入TextEntry(contentBody,contentTitle,pageContentId)值(?,?,?) Hibernate:插入PageContent_GROUP_DETAILS(PageContent_pageContentId,groups_groupId) (?,?) – dmcqu314 2013-04-04 05:06:02

+0

密鑰'groups_groupId'的重複條目'2'表示錯誤出現在關係表中用於保留它。如果您正確刪除了唯一約束,您將不會收到該錯誤。 – Thihara 2013-04-04 05:16:52

+0

我用新的創建表腳本更新了上面的帖子,刪除了約束。 – dmcqu314 2013-04-04 05:33:12