微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何让 JPA 的多对多关系与 kotlin 一起工作?延迟初始化异常

如何解决我如何让 JPA 的多对多关系与 kotlin 一起工作?延迟初始化异常

我就是无法将头环绕在它上面。我已经阅读了所有要阅读的内容,但我无法让它工作。这是一个非常简单的 sql 结构:

我得到了以下表格

create table currencies
(
    id INT auto_increment,isoAlpha VARCHAR(3) not null,isoNumeric VARCHAR(3) not null,name VARCHAR(100) not null,constraint currencies_pk
        primary key (id)
);

然后

create table countries
(
    id INT auto_increment,constraint countries_pk
        primary key (id)
);

最后是连接这两者的 mm 表:

create table mm_currency_country
(
    currency INT not null,country INT not null
);

在我的 Kotlin 代码中,我将实体定义如下:

@Entity
@Table(name = "currencies")
data class Currency (

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Int,@Column(nullable = false)
    val isoAlpha: String,@Column(nullable = false)
    val isoNumeric: Int,@Column(nullable = false)
    val name: String,@ManyToMany
    @JoinTable(name = "mm_currency_country",joinColumns = [JoinColumn(name = "currency",referencedColumnName = "id")],inverseJoinColumns = [JoinColumn(name = "country",referencedColumnName = "id")])
    val countries: Set<Country>
)

一个

@Entity
@Table(name="countries")
data class Country (
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Int,@ManyToMany(mappedBy = "countries")
    val currencies: Set<Currency>
)

我使用一个简单的 CrudRepository 来获取货币数据

@Repository
interface RepoCurrencies: CrudRepository<Currency,Int>

当我使用 findAll() 函数时,我获得了所有已注册的货币,但国家列表(在调试器视图中)仅填充了 LazyInitializationException 错误。似乎我需要某种 EntityGraph 才能使其正常工作......但到目前为止我所有实现此功能的尝试都失败了。有人可以给我一些指导吗?每个多对多关系总是抛出这个错误还是只是运气问题?!这看起来很基本,而且 Hibernate 无法开箱即用。

解决方法

@ManyToMany 关系默认是延迟获取的,这意味着您的货币对象持有国家属性的代理,当您访问它们时从数据库加载国家,例如通过迭代集合。为此,您需要一个活动会话。尝试注释调用 findAll() 并使用 @Transactional 访问国家/地区属性的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。