1

データベースにエントリを保存する際に問題が発生しています。次の階層を使用しています。

親クラス PageContent と 2 つのサブクラス TextEntry および Image がありますが、PageContent エンティティ以外を格納しようとすると、次の例外が発生します。

HTTP ステータス 500 - リクエストの処理に失敗しました。ネストされた例外は org.springframework.dao.DataIntegrityViolationException: Duplicate entry '2' for key 'groups_groupId'; です。SQL [該当なし]; 制約 [null]; ネストされた例外は org.hibernate.exception.ConstraintViolationException: キー 'groups_groupId' の重複エントリ '2' です

関連するクラスはこちら

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 に関係しているということであり、代わりに削除時に Cascade に変更すると、グループエンティティの重複挿入が削除されたと考えていましたが、それでも受け取ります前述の例外。

git リポジトリへのリンクは次のとおりです: http://github.com/dmcquillan314/YouthMinistryHibernate

事前に感謝します。

関連するすべての db テーブルのテーブル作成スクリプトは次のとおりです。

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
4

1 に答える 1

2

あなたはgroups_groupIdユニークなものを作っています。

しかし、PageContentクラスの関係はOneToMany.

関係表では以下のようになります。

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

したがって、この関係テーブルで任意の列を一意にすることはできません。

私が意味したのは、あなたが削除することでした

UNIQUE KEY `groups_groupId` (`groups_groupId`),

から

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
于 2013-04-04T04:40:05.553 に答える