2013-04-04 81 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