[英]hibernate @OneToMany join table not being created
我有两个表 Quiz 和 Question ,我想将它们与@OneToMany
关系关联,但连接表没有在 mysql 工作台数据库中创建。 以下是实体:
测验.java
@Entity
public class Quiz {
// attributes :
private Integer idQuiz;
private String quizTopic;
@OneToMany
@JoinColumn(name = "quiz_Id")
private List<Question> questions;
// constructors
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "quiz_Id")
public Integer getIdQuiz() {
return idQuiz;
}
@Column(name = "quiz_topic")
public String getQuizTopic() {
return quizTopic;
}
//setters
}
Question.java
@Entity
public class Question {
// attributes
private Integer idQuestion;
private String value;
private String op1;
private String op2;
private String op3;
private String correctAnswer;
// constructors
// Getters :
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "question_Id")
public Integer getIdQuestion() {
return idQuestion;
}
@Column(name = "question_value")
public String getValue() {
return value;
}
@Column(name = "question_op1")
public String getOp1() {
return op1;
}
@Column(name = "question_op2")
public String getOp2() {
return op2;
}
@Column(name = "question_op3")
public String getOp3() {
return op3;
}
@Column(name = "question_op4")
public String getCorrectAnswer() {
return correctAnswer;
}
//setters
}
没有创建外键
这是我跑步后得到的
Hibernate: create table question (question_id integer not null auto_increment, question_op4 varchar(255), question_op1 varchar(255), question_op2 varchar(255), question_op3 varchar(255), question_value varchar(255), primary key (question_id)) engine=InnoDB
Hibernate: create table quiz (quiz_id integer not null auto_increment, quiz_topic varchar(255), primary key (quiz_id)) engine=InnoDB
应用程序属性:
spring.main.web-application-type=none
spring.application.ui.title=Quiz
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/quiz?createDatabaseIfNotExist=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=justpass
spring.jpa.show-sql=true
注释
@OneToMany
private ArrayList<Question> questions;
不会创建连接表。 它应该在 Quiz 表的 Question 表中创建一个外键。 此外键与
private Integer idQuestion;
柱子。
对于您的解决方案,这取决于您是要建立单向还是双向@OneToMany
关系。 如果你想要一个单向的一对多关系,你必须定义一个@JoinColumn
来告诉 Hibernate 它应该在相关表中创建一个具有给定名称的外键。 大多数情况下,单向一对多关系是 go 最简单和充分的方法。
@OneToMany
@JoinColumn(name = "quiz_id")
private List<Question> questions;
通过这个 Hibernate 将在问题表中创建名为“ quiz_id ”的外键。
在双向情况下,我们可以从问题中访问测验,反之亦然,从测验中访问问题。 在这种情况下,您将必须在子 class 中定义代表父 class 的变量。 例如,如果测验应该是父 class,您将定义注释。 @OneToMany(mappedBy = "quiz")
。 除此之外,您还必须将问题定义为@ManyToOne
方面。 总而言之:
测验.java:
@OneToMany(mappedBy = "quiz")
private List<Question> questions;
Question.java
@ManyToOne(fetch = FetchType.LAZY)
private Quiz quiz;
由于性能原因,您将希望将 fetch 类型定义为惰性(过去我什至遇到了一些溢出错误,没有惰性方法)。
请记住,如果您将双向映射与 jackson 等序列化库一起使用,则在从 Z0ECD11C1D7A2877401D148A23F 反序列化/序列化到 Z0ECD11C1D7A287401DZ48A23F 时会遇到JSON 无限递归问题在这种情况下,您将希望使用@JsonIdentityInfo
仅序列化 id 而不是完整实体(这将导致无限递归)或@JsonIgnore
分别@JsonManagedReference
和@JsonBackReference
来不序列化实体的子依赖项。
我还建议在处理关系时使用定义级联类型的属性cascade
和orphanRemoval
来删除实体,但我不想用不相关的信息来破坏我的答案。
您尝试在Quiz
实体中混合访问策略看起来很可疑。
正如文档中所述:
作为 JPA 提供者,Hibernate 可以自省实体属性(实例字段)或访问器(实例属性)。 默认情况下,
@Id
注释的位置提供了默认访问策略。 放置在字段上时,Hibernate 将采用基于字段的访问。 当放置在标识符 getter 上时,Hibernate 将使用基于属性的访问。
所以,而不是这个:
@OneToMany
@JoinColumn(name = "quiz_Id")
private List<Question> questions;
将@OneToMany
和@JoinColumn(name = "quiz_Id")
注释放在适当的 getter 上:
@OneToMany
@JoinColumn(name = "quiz_Id")
public List<Question> getQuestions() {
return questions;
}
然后尝试通过设置spring.jpa.hibernate.ddl-auto
属性来重新创建您的架构:
spring.jpa.hibernate.ddl-auto=create
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.