这就像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实例?
提前致谢。
答案 0 :(得分:0)
不完全确定您的代码的作用,但要确保设置双向关系的两面。
如果在创建对象时只设置了一侧,则另一侧仍为空。
答案 1 :(得分:0)
您没有设置关系的拥有方面。关系的拥有方对应于表/类,其中外键引用另一方,即@ManyToOne方。你设置了非拥有方并不重要,这就是你在这里所做的事情:
boy.brothers = [bro1, bro2]
dao.save(boy)
当您调用dao.save(boy)
时,您的JPA提供程序将保留GroovyBoy
实例上的所有映射字段,然后将持久操作级联到每个GroovyBro
实例中它的收藏。您尚未在brother
个实例上设置GroovyBro
属性,因此外键设置为null。因此,当您在此处加载GroovyBro
实例时:
GroovyBro bro = (GroovyBro) dao.get(loadBro)
它正确地为brother
属性提供了空引用。要修复,请添加:
bro1.brother = boy
bro2.brother = boy
在致电dao.save(boy)
之前。
您可以离开boy.brothers = [bro1, bro2]
,但JPA不会查看集合的内容以设置外键关系。