Image

Imagealex_mq0 wrote in Imageru_java

Вопрос по Hibernate

Появился вопрос по Hibernate:

Таблица:

create table tags (
id integer,
objectid integer,
objecttype integer,
tag varchar(200)
)

Ключи созданы по следующим полям:
ID - primary key
objectid+objecttype
objectid+objecttype+tag

map file

<hibernate-mapping>
<class name="logic.tags.Tag" table="tags" lazy="true">
<id name="ID" column="ID" type="long">
<generator class="sequence">
<param name="sequence">tags_seq</param>
</generator>
</id>
<property name="objectID" column="ObjectID"/>
<property name="objectType" column="ObjectType"/>
<property name="tagName" column="Tag"/>
</class>
</hibernate-mapping>


class файл

public class Tag {

private String tagName;
private Long objectID;
private Long objectType;
private Long ID;

public Long getID() {
return ID;
}

private void setID(Long ID) {
this.ID = ID;
}

/**
* Конструктор тега
* @param tagName тег
* @param objectID идентификатор объекта к которому тег привязан
* @param objectType тип объекта
*/
public Tag(String tagName, Long objectID, Long objectType) {
this.tagName = tagName;
this.objectID = objectID;
this.objectType = objectType;
}

/**
* Конструктор тега
* @param ID ID
* @param tagName тег
* @param objectID идентификатор объекта к которому тег привязан
* @param objectType тип объекта
*/
public Tag(Long ID,String tagName, Long objectID, Long objectType) {
this.tagName = tagName;
this.objectID = objectID;
this.objectType = objectType;
this.ID = ID;
}

public Tag(){

}

public void setTagName(String tagName) {
this.tagName = tagName;
}

public void setObjectID(Long objectID) {
this.objectID = objectID;
}

public void setObjectType(Long objectType) {
this.objectType = objectType;
}

public String getTagName() {
return tagName;
}

public Long getObjectID() {
return objectID;
}

public Long getObjectType() {
return objectType;
}
}

в таблицу загружаю данные следующим образом:

int objectCount = 100;
int tagCount = 10;

con.createStatement().executeUpdate("delete from tags");
Statement stat = con.createStatement();
for (int i=0;i<objectCount;i++){
for (int j=0;j<tagCount;j++){
String tag = //здесь генерирую случайную строку;
stat.executeUpdate("insert into tags(ID,ObjectID,ObjectType,Tag) values("+tagCount*i+j+","+i+",1,'"+tag+"')");
}
}

Код загрузки Hibernate данных

        HashMap<Integer,List> data = new HashMap<Integer, List>();
        long startHibernate = System.currentTimeMillis();
        for (int i=0;i<objectCount;i++){
            String query = "from Tag " +
                    "where objectID = :objectID and objectType=:objectType";
            Query query1 = session.createQuery(query);
            query1.setLong("objectID",(long)i);
            query1.setLong("objectType",(long)1);
            List list = query1.list();
            data.put(i,list);
        }
        long stopHibernate = System.currentTimeMillis();
        System.out.println(new Date()+"Time Count:"+(stopHibernate-startHibernate));
 

Измеряю результат для загрузки напрямую через JDBC... результат немного удручающий: для 1`000`000 тегов при 10 тегах на объект я не дождался загрузки через Hibernate. JDBC загружалось чуть больше минуты.

Теперь вопрос:
Адекватные ли данные я получил? Можно ли как-нибудь оптимизировать производительность, и вообще предназначен ли Hibernate для загрузки такого объема данных?