渴望获取在Onetomany中有效,而在Manytoone中不起作用



这有点像 groovy 和 Java 的混合体。我创建了代码作为学习的一部分。

===================================================================
@Entity
public class GroovyBoy implements SimpleEntity {
@Id
@GeneratedValue
private long Id;
private String name;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private List<GroovyBro> brothers;
@Override
public Long getId() {
return Id;
}
@Override
public void setId(Long id) {
Id = id;
}
}
===================================================================
@Entity
class GroovyBro implements SimpleEntity {
    @Id
    @GeneratedValue
    private long Id;
    private String name;
    @ManyToOne(fetch=FetchType.EAGER)
    private GroovyBoy brother;
    @Override
    public Long getId() {
        return Id;
    }
    @Override
    public void setId(Long id) {
        Id = id
    }
}

===================================================================
        def dao = (MyDaoImpl) appContext.getBean("dao")
        def boy = new GroovyBoy()
        boy.name='boy1'
        def bro1 = new GroovyBro()
        bro1.name='bro1'
        def bro2 = new GroovyBro()
        bro2.name='bro2'
        boy.brothers = [bro1, bro2]
        dao.save(boy)
        //dao.evict(boy)
        println 'Id: ' + boy.brothers[0].id
        def loadBro = new GroovyBro();
        loadBro.id = boy.brothers[0].id
        GroovyBro bro = (GroovyBro) dao.get(loadBro)
        println 'Bro: ' + bro.brother
===================================================================

最后一行返回 null。但是当我获取 GroovyBoy 实体时,它会加载持久包,然后加载 GroovyBro 实例。为什么没有加载 GroovyBoy 实例?

提前谢谢。

不完全确定您的代码的作用,但请确保您设置了双向关系的两端。

如果在创建对象时只设置了一侧,则另一侧仍将为 null。

你没有设置关系的拥有方。 关系的拥有端对应于表/类,外键引用另一个,即@ManyToOne端。 你设置了非拥有方并不重要,这就是你在这里所做的:

boy.brothers = [bro1, bro2]
dao.save(boy)

当您调用 dao.save(boy) 时,您的 JPA 提供程序将持久化GroovyBoy实例上的所有映射字段,然后将持久化操作级联到其集合中的每个GroovyBro实例。 您尚未在任一 GroovyBro 实例上设置 brother 属性,因此外键设置为 null。 因此,当您在此处加载GroovyBro实例时:

GroovyBro bro = (GroovyBro) dao.get(loadBro)

它正确地具有 brother 属性的空引用。 要解决此问题,请添加:

bro1.brother = boy
bro2.brother = boy

在你打电话之前dao.save(boy).

您可以保留boy.brothers = [bro1, bro2],但 JPA 不会为了设置外键关系而查看集合的内容。

相关内容

最新更新