Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JPA-如何引用作为子表中复合键一部分的列_Spring_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Spring JPA-如何引用作为子表中复合键一部分的列

Spring JPA-如何引用作为子表中复合键一部分的列,spring,hibernate,jpa,jpa-2.0,Spring,Hibernate,Jpa,Jpa 2.0,如何从复合字段映射其中一列 我有两个表格问题和问题选项 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 TA

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

我有两个表格问题和问题选项

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中:

@JoinColumn(name = "question_id", nullable = false)
private List<QuestionOption> questionOptions;
@Entity
public class Question {
    @Id
    @Column(name="question_id")
    private long id;

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

    ...
}
@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;

    ...
}
问号optionpk.java

@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应用程序[/SpringRestCrud]中的Servlet[mvc dispatcher]引发load()异常 org.hibernate.MappingException:实体映射中的重复列:com.mobily.model.QuestionOption列:问题\u id(应使用insert=“false”update=“false”映射)


您需要使用派生标识

Question.java:

@JoinColumn(name = "question_id", nullable = false)
private List<QuestionOption> questionOptions;
@Entity
public class Question {
    @Id
    @Column(name="question_id")
    private long id;

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

    ...
}
@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:

@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节讨论了派生标识。

我更改了表结构。我删除了复合主键,而不是使用选项\ id作为主键,现在选项\ id是一个数字。我下定决心

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;

嗨,布莱恩,谢谢你的解决方案,但这是个小问题。我跟你说的一样变了。但两个表之间的关系是双向的。所以我一次又一次地得到相同的数据。我不明白你现在的问题是什么。也许你能给我更多的细节?