那些年踩过的@Entity的坑

@Entity
@Table(name = "users")
data class User(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int? = null,
    
    @Column(name = "accountId")
    val accountId: String,
    
    @JsonIgnore
    @OneToMany(mappedBy = "user")
    val userApps: List<UserApp>? = null
)

@Entity
@Table(name = "user_apps")
data class UserApp(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int? = null,
    
    @ManyToOne
    val user: User
)

interface UserRepository: JpaRepository<User, Int> {
    fun findByUserAppId(userAppId: Int): List<UserApp>
}

多对一的时候,@OneToMany要写明关联entity侧的变量名

像这个例子里写的一样,@OneToMany(mappedBy = “user”) 要协商mappedBy = “user”,这个user对应的是UserApp的@ManyToOne的变量名称,如果不一致启动spring的时候会出错。

@OneToMany的变量要赋初始值

val userApps: List<UserApp>? = null
如果没有初始值,启动spring的时候也会报错

相关联的Entity的JpaRepositroy的方法命名

像例子中的findByUserAppId,这个UserAppId,关联的是userApps的单数形式userApp,然后Id代表的是UserApp的Entity的主键。
然后,还有一个重要的点,table里面的column,也必须命名为user_app_id,不然虽然能启动Spring,但是执行sql的时候会出错。

Related Posts

Leave a Reply

Your email address will not be published. Required fields are marked *

Close Bitnami banner
Bitnami