我在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列引用多个列名,有什么想法?
答案 0 :(得分:2)
在Token
类中,您应该保留val userId: Long
或val user: User?
(更好的选择),而不要全部保留