繁体   English   中英

hibernate @OneToMany 连接表未创建

[英]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来不序列化实体的子依赖项。

我还建议在处理关系时使用定义级联类型的属性cascadeorphanRemoval来删除实体,但我不想用不相关的信息来破坏我的答案。

您尝试在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM