Spring Boot Kotlin中两个对象的一对多关系配置问题
问题分析与解决方案
错误提示Could not determine type for: com.jre.hireout.database.entities.users.User的核心原因是Job类中对User类型字段错误使用了@Column注解。@Column仅用于映射基本数据类型到数据库列,实体间的关联关系需要用JPA关联注解定义。
你的需求是「一个用户可创建多个任务,一个任务对应一个创建者」,属于典型的一对多(User→Job)双向关联,以下是修正后的代码:
1. 修正User.java(确保实体类配置完整)
@Entity @Table(name = "users") // 替换为你的User表名 public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 假设主键为id,根据实际调整类型 // 一对多关联,mappedBy指定Job中对应关联字段的名称 @OneToMany(mappedBy = "creationUser", cascade = CascadeType.ALL, orphanRemoval = true) private Set<Job> createdJobs = new HashSet<>(); // Getter和Setter public Set<Job> getCreatedJobs() { return createdJobs; } public void setCreatedJobs(Set<Job> createdJobs) { this.createdJobs = createdJobs; } // 其他字段与方法... }
2. 修正Job Kotlin数据类
将@Column替换为@ManyToOne,并通过@JoinColumn指定外键列名:
@Entity @Table(name = "table_jobs") data class Job( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, // 多对一关联,标记为关联关系的拥有方 @ManyToOne(fetch = FetchType.LAZY) // 默认懒加载,可按需改为EAGER @JoinColumn(name = "creation_user_id") // 数据库中存储用户外键的列名 val creationUser: User? = null, // 其他字段... )
关键说明
@ManyToOne:声明Job与User的多对一关联,负责维护数据库中的外键关系@JoinColumn:指定table_jobs表中存储User主键的列名,若开启ddl-auto,该列会自动创建fetch = FetchType.LAZY:默认懒加载策略,避免查询Job时不必要地加载User数据,可根据业务需求调整- 确保User和Job类均添加
@Entity注解,且主键字段配置@Id和@GeneratedValue
内容的提问来源于stack exchange,提问作者JamieRhys
相关产品推荐
相关产品推荐

