该表包含由多个逻辑列名称引用的物理列名称

时间:2020-08-30 19:59:27

标签: spring postgresql hibernate

我在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>()

和令牌实体

@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列引用多个列名,有什么想法?

1 个答案:

答案 0 :(得分:2)

Token类中,您应该保留val userId: Longval user: User?(更好的选择),而不要全部保留