2012-06-20 18 views
1

這就像混合了groovy和Java。我創建了代碼作爲學習的一部分。在Onetomany中工作很急,而不是在Manytoone工作

=================================================================== 

@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

您未設置擁有一方的關係。關係的擁有方對應於帶有外鍵引用的表/類,@ManyToOne方。沒關係,你已經設置了非持有端,這是你在做什麼,在這裏:

boy.brothers = [bro1, bro2] 

dao.save(boy) 

當你調用dao.save(boy),JPA提供者,是要堅持所有映射的字段上您GroovyBoy實例,然後將持久操作級聯到其集合中的每個GroovyBro實例。您沒有在GroovyBro實例的任一個上設置brother屬性,因此外鍵設置爲空。因此,如果您在此處加載您GroovyBro例如:

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

它具有正確的brother財產空引用。要修復,請添加:

bro1.brother = boy 
bro2.brother = boy 

在您致電dao.save(boy)之前。

您可以離開boy.brothers = [bro1, bro2],但JPA不會查看集合的內容以設置外鍵關係。

相關問題