[jboss-user] [EJB 3.0] - Getter for LAZY property gets called on every commit
markus.doering
do-not-reply at jboss.com
Wed Nov 14 05:29:58 EST 2007
Hello,
First of all, i'm working with JBoss 4.2.0 GA and MySQL 5.
I have the following code for my EntityBeans:
EntityBean1
@Entity
| public class EntityBean1 {
| private long id;
|
| private byte[] data;
|
| private boolean active;
|
| private EntityBean2 relation;
|
| @Id
| @GeneratedValue(strategy=GenerationType.AUTO)
| public long getId() {return this.id;}
|
| public void setId(long id) {this.id = id;}
|
| public boolean isActive() {return this.active;}
|
| public boolean setActive(boolean active) {this.active = active;}
|
| @Lob
| @Column(columnDefinition = "LONGBLOB")
| @Basic(fetch = FetchType.LAZY)
| public byte[] getData() {
| log.debug("getData called");
| return this.data;
| }
|
| public void setData(byte[] data) { this.data = data;}
|
| @ManyToOne
| public EntityBean2 getRelation() {return this.relation;}
|
| public void setRelation(EntityBean2 relation) {this.relation = relation;}
| }
EntityBean2
@Entity
| public class EntityBean2 {
| private long id;
|
| private List<EntityBean1> relation;
|
| @Id
| @GeneratedValue(strategy=GenerationType.AUTO)
| public long getId() {return this.id;}
|
| public void setId(long id) {this.id = id;}
|
| @OneToMany(mappedBy = "relation", cascade = cascadeType.ALL)
| public List<EntityBean1> getRelation() {return this.relation;}
|
| public void setRelation(List<EntityBean1> relation) {this.relation = relation;}
| }
SomeStatelessSessionBean
@Stateless
| public class SomeStatelessSessionBean implements SomeStatelessSessionLocal {
|
| public List<EntityBean1> doSomething() {
| log.debug("doSomething started");
| List<EntityBean1> out = new ArrayList<EntityBean1>();
| EntityBean2 bean2 = someFinder();
| for(EntityBean1 bean1 = bean2.getRelation()) {
| if(bean1.isActive()) {
| out.add(bean1);
| }
| }
| log.debug("doSomething ended");
| return out;
| }
| }
What i do is calling the doSomething() methode from somehwere with a log.debug("start"); before and a log.debug("end"); directly after the methode call.
What i get is the following log:
| XXX DEBUG start
| XXX DEBUG doSomething started
| XXX DEBUG doSomething ended
| XXX DEBUG getData called
| XXX DEBUG getData called
| XXX DEBUG getData called
| XXX DEBUG getData called
| XXX DEBUG getData called
| XXX DEBUG end
|
What does this means?
As far as i can see, when the transaction from doSomething() is commited, the getData() methode of the EntityBean1 get called. This should NOT be the case, because it is set to LAZY and i NEVER use the byte[] in this case.
My problem is that the byte[] might be large, and at some point, i get an OOMException: heapSize. I've done a HeapDump and saw LOTS of byte[] in the memory, that's how i found this strange behavier. I also checkt if the getData() get's called by the equals() or hashCode() methode of EntityBean1, but this is not the case.
Is this a bug in EJB3 (hibernate?) or is something "wrong" with my code? Or is it working as designed and there are no "real" lazy byte[] propertys?
Thanks for help
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4104457#4104457
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4104457
More information about the jboss-user
mailing list