【问题标题】:How to map @EmbeddedId in Ebean with Scala如何使用 Scala 在 Ebean 中映射 @EmbeddedId
【发布时间】:2015-02-12 10:16:28
【问题描述】:

Custom bridge table in playframework ebean 中有一个示例如何在Java 中使用@EmbeddedId 和Ebean 映射模型。但是 Scala 语言没有这样的例子。

假设我们在 Scala 中有以下 3 类模型:

学生班:

class Student (aId: Int, fName: String, lName: String) { 

    val id:Int=aId
    val firstName:String=fName
    val lastName:String=lName   
    var enrollments:java.util.List[Enrollment]
} 

课程类别:

class Course (aId: Int, aName: String) { 

    val id:Int=aId
    val name:String=aName
    var enrollments:java.util.List[Enrollment]
}

报名班级:

class Enrollment (aDesc: String, aStudent: Student, aCourse: Course) { 

    val description:String=aDesc
    val enrollmentId:EnrollmentId
    val student:Student = aStudent
    val course:Course = aCourse
}

如何在 PlayFramework 中使用 Ebean 将此模型映射到数据库?

【问题讨论】:

    标签: scala orm playframework ebean composite-key


    【解决方案1】:

    这可以通过以下方式完成:

    学生班:

    @Entity
    class Student (aId: Int, fName: String, lName: String) { 
    
        @Id
        val id:Int=aId
    
        @Column(name="first_name")
        val firstName:String=fName
    
        @Column(name="last_name")
        val lastName:String=lName
    
        @OneToMany(mappedBy="student")
        var enrollments:java.util.List[Enrollment] = _
    }
    

    课程类别:

    @Entity
    class Course (aId: Int, aName: String) { 
    
        @Id
        val id:Int=aId
    
        @Column(name="name")
        val name:String=aName
    
        @OneToMany(mappedBy="course")
        var enrollments:java.util.List[Enrollment] = _
    }
    

    报名班级:

    @Entity
    class Enrollment (aDesc: String, aStudent: Student, aCourse: Course) { 
    
        @Column(name="name")
        val description:String=aDesc
    
        @EmbeddedId
        val enrollmentId:EnrollmentId = new EnrollmentId(aStudent.id, aCourse.id)
    
        @ManyToOne
        @JoinColumn(name = "student_id", insertable = false, updatable = false)
        val student:Student = aStudent
    
        @ManyToOne 
        @JoinColumn(name="course_id", insertable = false, updatable = false)
        val course:Course = aCourse
    }
    

    EnrollmentId 类:

    @Embeddable
    class EnrollmentId (aStudentId: Int, aCourseId: Int) { 
    
        val student_id:Int = aStudentId
    
        val course_id:Int = aCourseId
    
        override def hashCode(): Int = student_id + course_id
    
        override def equals(that: Any): Boolean = {
            that match {
                case e: EnrollmentId => this.student_id == e.student_id && this.course_id == e.course_id 
                case _ => false
            }
        }
    }
    

    这段代码中最重要的是,从 Enrollment 到 Student 的关系以两种方式映射:

    • 作为@ManyToone 关系
    • 作为复合键的列

    但是这种关系只能通过复合键保存。 @ManyToOne 关系将 @JoinColumn 属性“可插入”和“可更新”设置为 false,这就是它不以这种方式保存的原因。

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 2012-04-10
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2023-02-14
      • 2014-02-25
      相关资源
      最近更新 更多