当前位置: 首页 > 知识库问答 >
问题:

使用组合标识符@embeddedId和@onetoone

曹泉
2023-03-14

实体:课程教师Coursepk

每门课程只能由一名老师授课。

我在班级教师和班级课程之间使用双向关系@onetoone()

@Entity(name = "Teacher")
public class Teacher {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @OneToOne(mappedBy = "officialTeacher")
    private Course course;

    //setter getter constructors are omitted for brevity
}

课程类:

@Entity(name = "Course")
public class Course {

    @EmbeddedId
    private CoursePk pkCourse;

    @OneToOne(cascade = CascadeType.PERSIST)
    private Teacher officialTeacher;

    //setter getter constructors are omitted for brevity
}

应表示复合主键的Coursepk

@Embeddable
public class CoursePk implements Serializable {

    @Column(name = "courseName")
    private Integer courseId;
}

我的运行示例:

private void composedPrimaryKey() {
        Teacher teacher = new Teacher("Jeff", "Boss");
        CoursePk composedPK = new CoursePk(1);
        Course course = new Course(composedPK, teacher);
        Course savedCourse = courseRepository.save(course);
    }
course_name | official_teacher_id
     1      |      1
id  | first_name |last_name
 1  |   null     |  null
id  | first_name |last_name
 1  |   Jeff     |  Boss

共有1个答案

惠志
2023-03-14

如果使用了Spring Data JPA,那么CrudRepository.save(…)方法如何检测要执行的方法调用有一些细节:EntityManager.persist(…)EntityManager.merge(…):

保存实体可以使用CrudRepository.save(…)方法执行。它通过使用底层JPAEntityManager来保存或合并给定的实体。如果实体尚未持久化,Spring Data JPA通过调用EntityManager.persist(…)方法保存实体。否则,它调用EntityManager.merge(…)方法。

Spring Data JPA提供了以下策略来检测实体是否是新的:

    null

<…>

-Spring Data JPA-参考文档。

回到问题中提到的代码段。
由于course实例的identifier属性(主键)不是null,Spring Data JPA将其视为现有(而不是新的)实体,并调用EntityManager.merge(…)方法,而不是EntityManager.persist(…)方法。

 类似资料:
  • 我是ASP.NET新手,我必须使用身份验证和授权框架创建一个ASP.NET MVC项目,但对数据库(SQL Server)的访问必须在一个独立的web服务项目中完成,所以我创建了一个web API项目,该项目还包含请求数据库的应用程序的所有服务,即使是通过调用web API的方法而不是ASP.NET MVC项目的方法来完成身份验证,而且一切都很好。 请帮忙。

  • 问题内容: 我创建了一个使用@Id指向@Embeddable复合键的实体。我认为一切正常。但是,据我所知,在将@Id切换为@EmbeddedId之后,一切仍然可以正常工作。 之前: 后: 引用复合键时,使用@Id和@EmbeddedId批注之间有区别吗? 问题答案: 实际上,我对 “之前” 版本的工作感到惊讶。根据规范,映射您的复合键的正确方法是 “之后” 版本。引用JPA 1.0规范: 2.1.

  • 你可以使用一个组件作为一个实体类的标识符。你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意 注意:在 Hibernate3 中,第二个要求并非是 Hibernate 强制必须的。但最好这样做。 你不能使用一个 IdentifierGenerato

  • 问题内容: CSS标识符和的(完整)有效/允许的 字符集 字符是什么? 是否可以使用正则表达式进行验证?它与浏览器无关吗? 问题答案: 字符集无关紧要。允许的字符更重要。检查CSS规范。这里是相关的: 在CSS中,标识符(包括选择器中的元素名称,类和ID )只能包含字符和ISO 10646 及更高版本的字符,以及连字符()和下划线();它们不能以数字,两个连字符或连字符后跟数字开头。标识符还可以包

  • 主要内容:标识符,关键字任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍 Java 的标识符、关键字和保留字。 标识符 Java 中标识符是为方法、变量或其他用户定义项所定义的名称。标识符可以有一个或多个字符。在 Java 语言中,标识符的构成规则如下。 标识符由数字(0~9)和字母(A~Z 和 a~z)、美元符号($)、下划线(_)以及 Unicode 字符集中符号大于 0xC0 的所有符号组合构成(各符号

  • 标识符 Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母、数字、大写字母组成,例如 hello.go 。如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 pro_03.go 。文件名不包含空格或其他特殊字符。 一个源文件可以包含任意多行的代码,Go 本身没有对源文件的大小进行限制。 Go 语言也是区分大小写的,这与 C 家族中的其它语言相同。有效的标识符必须以