如何在Springboot中向实体集合添加新条目

r7xajy2e  于 2023-01-24  发布在  Spring
关注(0)|答案(1)|浏览(123)

假设有一个类如下所示:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
class OauthUser(
    @OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
    var oauthAttributes: List<OauthAttribute>,

    @NotNull
    @Column(unique = true)
    var email: String,
    var firstName: String,
    var lastName: String
) : OAuth2User {

    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    var id: Long? = null

}

我尝试在用户初次登录后再次登录时添加oauthAttributes的新条目,以便如果有更新的属性,则创建新属性以保存配置文件更改的历史记录。
我不能userRepository.findByEmail(email).oauthAttributes.add(newEntry),因为oauthAttributes被定义为一个List,它没有add方法。当我试图将它转换为ArrayList时,我得到了以下错误:java.lang.ClassCastException: class org.hibernate.collection.internal.PersistentBag cannot be cast to class java.util.ArrayList.
我该如何着手在那个列表中添加条目呢?

ie3xauqp

ie3xauqp1#

在做了一些阅读和实验后,我发现下面的作品:
1.在OauthAttribute类中创建对用户的引用,如下所示:

@ManyToOne
    @JoinColumn(name = "user_id")
    @NotNull
    lateinit var user: OauthUser

1.调整OauthUser类中的oauthAttributes集合定义,从

@OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
    var oauthAttributes: List<OauthAttribute>,

@OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.EAGER, mappedBy = "user")
    var oauthAttributes: List<OauthAttribute>?

这将在oauth_attribute表中创建一个user_id外键引用,而不是一个单独的连接表。现在可以创建OauthAttribute类的新示例,并通过指定将user类属性分配给相应的用户来将它们分配给用户。
我欢迎任何意见,以防解决方案不是最佳的。而且,我相信这个问题仍然代表着许多对许多的关系。

相关问题