Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate: getting too many rows

I have problem with getting rows from my database using Hibernate. When I would like to get only one row, I am receiving 20. When I would like to get all of rows from table with about 1.5k rows, I am receiving exactly 15.2k rows. Entity class of this table has composite primary key.

This is my code for getting all rows:

Criteria criteria = getSession().createCriteria(type);
criteria.setCacheable(true).setCacheRegion(BaseEntity.PACKAGE);
criteria.list();

And this is my Entity class:

@javax.persistence.Entity
@Table(name = "my_table")
public class My extends MyEntity<MyPK> {

    @EmbeddedId
    private MyPK id;

    @Column(name = "text", nullable = false)
    protected String text;

    @ManyToOne
    @JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
    protected Option option;

    @Override
    public MyPK getId() {
        return id;
    }

    @Override
    public void setId(MyPK id) {
        this.id = id;
    }

    //getters and setter
}

And this is MyPK class:

@Embeddable
public class MyPK implements Serializable {

   @Column(name = "qwerty")
   protected String qwerty;

   @Column(name = "property")
   protected String property;

   //constructors, getters and setters
}

MyEntity class is abstract class with @MappedSuperclass annotation. This is this class header:

@MappedSuperclass
public abstract class MyEntity<T extends Serializable>

What am I doing wrong? Is this problem with EmbeddedId?

EDIT #1 As I have realized this is problem with this:

@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;

This object contains foreign key to another table. And this another table has reference to another. And this last table has 10 rows for previous table. In the result I am getting rows amount * 10. The problem is probably with Hibernate annotation in my entities.

like image 298
woyaru Avatar asked Oct 09 '12 08:10

woyaru


2 Answers

It looks like you're probably eagerly joining a many-to-one relationship somewhere. The default behavior is that you get one entity for each row returned by the database. If you don't want to change the eager fetching, but do want to remove duplicates in your result, you need to use this ResultTransformer:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
like image 98
Kevin Stricker Avatar answered Nov 15 '22 02:11

Kevin Stricker


@Embeddable only means that MyPK 's columns will be columns in the My class. Your problem might be @ManyToOne @JoinColumn(name = "property") since it's the same with "property" in MyPK

like image 31
Mite Mitreski Avatar answered Nov 15 '22 02:11

Mite Mitreski