如何解决我如何让 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 举报,一经查实,本站将立刻删除。