2011-07-14 131 views
2

在我的实体对象中,我将所有JPA注释放在字段上。他们与Project Lombok很好地合作,它为我生成了所有的getter和setters,极大地简化了我的代码。即使注释在方法上,自定义方法也不会被调用?

编辑:

这似乎也发生了,当我移动注释到方法

@OneToMany(targetEntity = ChannelDAOHb.class, mappedBy = "server", orphanRemoval = true) 
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE}) 
public Set<ChannelDAO> getChannels() { 
    System.out.println("Getting some channels"); 
    ... 
} 

getChannels().add(new Channel("someChannel")); //Nothing printed here 

但是它似乎是自吸我的一对多关联的领域之一是不被称为。甚至像这样破坏性的东西

public Set<ChannelDAO> getChannels() { 
    throw new RuntimeException("Take that, Hibernate"); 
} 

getChannels().add(new Channel("someChannel")); 

这个异常从不被抛出。

这是怎么回事?为什么我的getter没有被调用?

+0

你的领域是公开的吗? – Marcelo

+0

@Marcelo不,我的领域不公开 – TheLQ

回答

1

Hibernate默认使用反射。方法仅适用于您自己的API。这减少了建立持久层所需的脚手架。

+0

不,我的意思是从我自己的代码中调用getChannels()并不会净化这个异常。我应该在 – TheLQ

+0

@TheLQ这个问题中澄清这个问题,Hibernate实际上创建了代理类继承你的实体,以便能够处理管理关系的懒惰方法,并且你的getChannels()方法将被延迟加载行为覆盖。 – Marcelo

+0

@Marcelo太棒了......这是否意味着我现在必须将所有JPA注释移动到getters? – TheLQ

相关问题