首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA -如何在子表中引用属于复合键的列

JPA -如何在子表中引用属于复合键的列
EN

Stack Overflow用户
提问于 2015-12-10 22:03:31
回答 2查看 408关注 0票数 0

如何从复合字段映射其中一列?

我有两个表:问题和Question_options。

代码语言:javascript
复制
CREATE TABLE `question` (
  `question_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `question` varchar(500) NOT NULL,
  PRIMARY KEY (`question_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=501 DEFAULT CHARSET=utf8;

CREATE TABLE `question_options` (
  `question_id` smallint(5) unsigned NOT NULL,
  `option_id` varchar(3) NOT NULL,
  `option_description` varchar(500) NOT NULL,
  PRIMARY KEY (`question_id`, `option_id`),
  KEY `idx_fk_op_question_id` (`question_id`),
  KEY `idx_fk_op_option_id` (`option_id`),
  CONSTRAINT `fk_op_question_id` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON UPDATE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在Question.java中:

代码语言:javascript
复制
@JoinColumn(name = "question_id", nullable = false)
private List<QuestionOption> questionOptions;

在QuestionOption.java中

代码语言:javascript
复制
@EmbeddedId
private QuestionOptionPK id;

在QuestionOptionPK.java中

代码语言:javascript
复制
@Column(name="question_id", insertable=true, updatable=false, unique=true, nullable=false)
private long questionId;

@Column(name="option_id", insertable=true, updatable=false, unique=true, nullable=false, length=3)
private String optionId;

在Question.java中,我指的是复合键(QuestionOptionPK)的一个字段是questionId。

但我得到的错误如下:

严重: web应用程序中的Servlet mvc-dispatcher抛出load()异常org.hibernate.MappingException:实体映射中的重复列: com.mobily.model.QuestionOption列: question_id (应映射为insert="false“update="false")

EN

回答 2

Stack Overflow用户

发布于 2015-12-10 23:21:43

您需要使用派生身份。

Question.java:

代码语言:javascript
复制
@Entity
public class Question {
    @Id
    @Column(name="question_id")
    private long id;

    @OneToMany(mappedBy="question")
    private List<QuestionOption> questionOptions;

    ...
}

QuestionOption.java:

代码语言:javascript
复制
@Entity
@Table(name="question_options")
public class Question {
    @EmbeddedId
    private QuestionOptionPK id;

    @ManyToOne
    @JoinColumn(name = "question_id")
    @MapsId("questionId") // maps questionId attribute of the embedded ID
    private Question question;

    ...
}

QuestionOptionPK.java:

代码语言:javascript
复制
@Embeddable
public class QuestionOptionPK {
    private long questionId; // corresponds to the PK type of Question

    @Column(name="option_id")
    private String optionId;
}

派生身份在JPA 2.1规范的2.4.1节中进行了讨论。

票数 0
EN

Stack Overflow用户

发布于 2015-12-14 15:39:42

我改变了我的桌子结构。我删除了复合主键,而不是使用option_id作为主键,现在option_id是一个数字。我下定决心了。

代码语言:javascript
复制
CREATE TABLE `question` (
  `question_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
 -- `category` varchar(25) NOT NULL,
  `question` varchar(500) NOT NULL,
--  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`question_id`)
--  KEY `idx_fk_category` (`category`)
 ) ENGINE=InnoDB AUTO_INCREMENT=501 DEFAULT CHARSET=utf8;

CREATE TABLE `question_options` (
  `option_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `question_id` smallint(5) unsigned NOT NULL,
  `option_key` varchar(3) NOT NULL, -- It is like a, b, c... .
  `option_description` varchar(500) NOT NULL,
--  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`option_id`),
  KEY `idx_fk_op_question_id` (`question_id`),
--  KEY `idx_fk_op_option_id` (`option_id`),
  CONSTRAINT `fk_op_question_id` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON UPDATE CASCADE
 ) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34203888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档