【问题标题】:Table contains physical column name referred to by multiple logical column names表包含多个逻辑列名引用的物理列名
【发布时间】:2020-08-30 19:59:27
【问题描述】:

我在 Kotlin 中使用 Spring Jpa,我有 2 个表,第一个是用户表,第二个是刷新令牌表,其中列 user_id 引用 users.id

我正在尝试在这两个表之间创建 OneToOne 关系

这是我的用户实体

@Entity
@Table(name = "users")
class User (
    val name: String

    @OneToOne(mappedBy = "user", cascade = [CascadeType.ALL])
    val refreshToken: Token? = null
) : : AbstractBaseEntity<Long>()

和Token实体

@Table(name = "user_refresh_token")
@Entity
class Token (
        var token: String,
        val userId: Long,

        @MapsId
        @OneToOne
        val user: User? = null

) : AbstractBaseEntity<Long>() 

AbstractBaseEntity 仅包含 Id 字段

@MappedSuperclass
abstract class AbstractBaseEntity<T> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: T? = null

}

在我的 Postgres 数据库中看起来像

create table users (
    id serial primary key,
    name text not null
);

create table user_refresh_token (
    user_id int primary key references users(id) on delete cascade,
    token text not null
)

在日志中我看到了错误

Caused by: org.hibernate.DuplicateMappingException: Table [user_refresh_token] contains physical column name [user_id] referred to by multiple logical column names: [user_id], [userId]

也是我的 TokenRepository

@Repository
interface TokenRepository : CrudRepository<Token, Long>

我无法弄清楚为什么会发生这种情况以及为什么列 user_id 引用了多个列名,有什么想法吗?

【问题讨论】:

    标签: spring postgresql hibernate


    【解决方案1】:

    Token 类中,您应该保留val userId: Longval user: User?(更好的选择),而不是两者都保留

    【讨论】:

      猜你喜欢
      • 2021-05-19
      • 1970-01-01
      • 2019-01-26
      • 2020-01-01
      • 2017-06-03
      • 2018-02-22
      • 1970-01-01
      • 2014-09-21
      • 2021-08-27
      相关资源
      最近更新 更多