gpt4 book ai didi

java - 如何强制 OpenJPA (1.2.2) 急切加载 @ManyToOne 组合主键?

转载 作者:行者123 更新时间:2023-11-30 11:51:45 25 4
gpt4 key购买 nike

我有两个具有组合主键的实体:

@Entity
@IdClass(APK.class)
public class A {
@Id
Integer pk1;

@Id
Integer pk2;

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER,mappedBy="a")
List<B> b = new ArrayList<B>();

String name;
...
}

@Entity
@IdClass(BPK.class)
public class B {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumns({
@JoinColumn(name = "pk1", referencedColumnName = "pk1"),
@JoinColumn(name = "pk2", referencedColumnName = "pk2")
})
@Id
private A a;

@Id
Integer additional_key_part;

}

当我加载“A”类时,急切地正确加载了列表,问题是,当我加载“B”类时它不起作用。

“B”类将正确使用与 A 的连接,但只会填充 A 的 PK 字段(pk1、pk2),而不填充其余部分。

真正的问题出现在将实体发送到没有事务的客户端时,因此无法延迟加载。似乎唯一可行的方法是在关闭事务之前调用 a.getName() 或其他方法来启动延迟加载,但这似乎并不是真正正确的方法。

那么,如何确保实体及其所有子实体都已加载?

最佳答案

尝试将注释更改为以下内容:

@Entity
@IdClass(ClassBPK.class)
public class ClassB {

@Id
private Integer pk1;
@Id
private Integer pk2;

@ManyToOne(fetch = FetchType.EAGER)
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name = "pk1", referencedColumnName = "pk1"),
@PrimaryKeyJoinColumn(name = "pk2", referencedColumnName = "pk2")
})
private ClassA a;

@Id
private Integer pk3;

//...
}

我使用 Derby 和草稿 DAO 类对 OpenJPA 1.2.2 进行快速检查:

logger.debug("Pre find");
ClassB b = bDAOBean.findById(bId);
logger.debug("Post find");
logger.debug("A's name: {}", b.getA().getName());

我得到了:

[DEBUG] Pre find 
[INFO ] openjpa.Runtime - Starting OpenJPA 1.2.2 {main}
// ... Here comes SQL from loading the entity
[DEBUG] Post-find
[DEBUG] A's name: nameA11

最后两行日志之间没有OpenJPA日志,证明整个ClassA被急切加载。

关于java - 如何强制 OpenJPA (1.2.2) 急切加载 @ManyToOne 组合主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7273046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com