0

我用连接表定义的 2 个表之间存在多对多关系。

//MyClassA
@ManyToMany
@JoinTable(name="A_TO_B", 
           joinColumns=@JoinColumn(name="A_UUID"), 
           inverseJoinColumns=@JoinColumn(name="B_UUID")
)
private List<MyClassB> classBs = new ArrayList<MyClassB>();

//MyClassB
@ManyToMany(mappedBy="classBs")
private List<MyClassA> classAs = new ArrayList<MyClassA>();

由于公司架构限制,连接表必须有一个 UUID 列。

我有一个名为 DAO 的方法associateItems,它应该在连接列中插入一行。为了测试所有内容,我在 jUnit 测试中执行以下操作。

myDao.associateItems(classAItem, classBItem);

classAItem = myDao.get(classAItem.getUuid());
classBItem = myDao.get(classBItem.getUuid());

assertEquals(1, classAItem.getClassBs().size());
assertEquals(1, classBItem.getClassAs().size());

此测试在最后 2 行失败。

在我的 DAO 中,我尝试了很多事情。我尝试将classAItemand添加classBItem到彼此的列表中并合并它们。但这会导致错误,因为连接表对象没有 UUID。我尝试创建连接表对象并将其持久化。但随后测试的最后两行失败,因为它认为列表的大小为 0。

我一直坚持第二种解决方案(失败总比错误好)。

public void associateItems(MyClassA classAItem, MyClassB classBItem) {
    //UUID populated in constructor
    AToB association = new AToB(classAItem, classBItem); 
    entityManager.persist(association);
}

我知道连接表项正在插入到数据库中。我还手动输入了一个连接表项,并确保在找到关联时填充列表。所以测试只是在制作连接表项然后关联相关列表方面存在问题。

我尝试过处理级联、获取类型和刷新。但我似乎找不到让测试通过的方法。

有人知道我需要做什么来解决这个问题吗?

4

1 回答 1

0

这实际上是getDAO 中方法的问题。我添加了以下提示并测试运行没有失败。

query.setHint(QueryHints.REFRESH, HintValues.TRUE);
于 2012-05-14T17:32:29.297 回答