1

这就像 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 实例?

提前致谢。

4

2 回答 2

0

不完全确定您的代码做了什么,但请确保您设置了双向关系的双方。

如果在创建对象时只设置了一侧,那么另一侧仍然为空。

于 2012-06-21T13:42:41.040 回答
0

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

boy.brothers = [bro1, bro2]

dao.save(boy)

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

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

brother它正确地对该属性有一个空引用。要修复,请添加:

bro1.brother = boy
bro2.brother = boy

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

您可以离开boy.brothers = [bro1, bro2],但 JPA 不会查看集合的内容来设置外键关系。

于 2012-07-09T04:05:28.873 回答