Java JPA ORM 一对多 多对一

Posted

技术标签:

【中文标题】Java JPA ORM 一对多 多对一【英文标题】:Java JPA ORM OneToMany ManyToOne 【发布时间】:2021-10-14 12:21:21 【问题描述】:

我正在尝试定义两个类之间的双向关系。拥有方是 Quiz 类,反之是 User。一个用户可以创建许多测验,而一个测验只能有一个用户创建它。我在网上找到的每个教程都指出,在拥有方指定 ManyToOne 注释和 JoinColumn,在相反方指定 OneToMany 和 mappedBy 以及所有者字段的名称。但是,当我这样做时,IDE 给我一个错误“找不到反比关系”。这个概念我哪里错了?任何帮助或指导将不胜感激。

build.gradle

plugins 
    id 'org.springframework.boot' version '2.2.2.RELEASE'
    id 'java'
    id "io.freefair.lombok" version "6.1.0-m3"


apply plugin: 'io.spring.dependency-management'

sourceCompatibility = 11

repositories 
    mavenCentral()


sourceSets.main.resources.srcDirs = ["src/resources"]

dependencies 
    implementation 'org.springframework.boot:spring-boot-starter:2.5.3'
    implementation 'org.springframework.boot:spring-boot-starter-actuator:2.5.3'
    implementation 'org.springframework.boot:spring-boot-starter-web:2.5.3'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.5.3'
    implementation 'org.springframework.boot:spring-boot-starter-security:2.5.3'
    implementation 'org.springframework.boot:spring-boot-starter-validation:2.5.3'
    runtimeOnly 'com.h2database:h2:1.4.200'

测验.java

@Entity
@Table(name = "quizzes")
public class Quiz 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    ...

    @ManyToOne
    @JoinColumn(name = "UserID")
    private User createdBy;


用户.java:

@Entity
@Table(name = "users")
public class User 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    ...

    @OneToMany(mappedBy = "createdBy")
    @MapKey(name = "id")
    private HashMap<Integer, Quiz> quizzes;


我尝试更改为 Map 引用而不是 HashMap,将 targetEntity 选项添加到 OneToMany 注释并指向 Quiz.class,将显式 @Column(name = "[columnName]") 添加到每个类字段等。仍然是 IDE给我“找不到反比关系”的错误。我不明白我做错了什么。

这是我在网上找到的一个例子:https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/map-with-entity-values.html

【问题讨论】:

【参考方案1】:

我认为您尝试遵循的方法不正确。您不需要有一个map 对象来存储关联之间的键和相关实体。

一个简单的OneToMany 映射可以通过像以下示例这样最小的东西来实现:

@Data
@Entity
@Table(name = "users")
public class User 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
    private List<Quiz> quizzes = new ArrayList<>();


@Data
@Entity
@Table(name = "quizzes")
public class Quiz 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @JoinColumn(name = "user_id")
    @ManyToOne(fetch = FetchType.LAZY)
    @ToString.Exclude
    private User user;


我还认为您正在查看的教程可能会将您引向错误的方向。查看以下链接以获取更多具体信息:

https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

https://thorben-janssen.com/best-practices-many-one-one-many-associations-mappings/

【讨论】:

嘿,感谢您分享的解释和链接。我明白你的意思。我会尝试一下。感谢您的回复。 很高兴为您提供帮助

以上是关于Java JPA ORM 一对多 多对一的主要内容,如果未能解决你的问题,请参考以下文章

Spring - JPA 一对一, 一对多, 多对多关联

JPA的一对多,多对多用法

laravel ORM 一对一 一对多 多对多 原生的MYSQL怎么写

mybatis映射 一对一,一对多,多对多高级映射

JPA中实现单向一对多的关联关系

Hibernate 中一对一、多对一和一对多的默认获取类型