Table contains physical column name referred to by multiple logical column names

Viewed 2807

I'm using Spring Jpa with Kotlin, i got 2 tables, first is an user table, second is refresh token table, where column user_id references on users.id column

I'm trying to create OneToOne relationship between these 2 tables

Here's my user entity

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

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

And Token entity

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

        @MapsId
        @OneToOne
        val user: User? = null

) : AbstractBaseEntity<Long>() 

AbstractBaseEntity contains only Id field

@MappedSuperclass
abstract class AbstractBaseEntity<T> {

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

}

In my Postgres database it looks like

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
)

In logs i see the error

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]

Also my TokenRepository

@Repository
interface TokenRepository : CrudRepository<Token, Long>

I can't figure out why it's happening and why column user_id referred to multiple column names, any ideas?

1 Answers

In Token class you should keep either val userId: Long or val user: User? (better option), not both of them

Related