Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp
Hibernate version: 3.2
Mapping documents:
Media.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<!-- Indicamos la clase a persistir y la tabla a la que corresponde-->
<class name="com.mimetics.beans.Media" table="media">
<!-- Especificamos la clave primaria -->
<id name="mediaId" type="java.lang.Long" column="media_id">
<generator class="native"/>
</id>
<!-- A continuación el resto de atributos -->
<property name="fileName" type="java.lang.Long" column="filename" not-null="true" length="255"/>
<property name="size" type="java.lang.Long" column="file_size" not-null="true"/>
<property name="sizeMb" type="java.lang.Integer" column="file_size_mb" not-null="true"/>
<property name="path" type="java.lang.String" column="path" not-null="true" length="255"/>
<property name="description" type="java.lang.String" column="description" not-null="false"/>
<property name="views" type="java.lang.Long" column="views" not-null="true" />
<property name="title" type="java.lang.String" column="title" not-null="false" length="255"/>
<property name="tags" type="java.lang.String" column="tags" not-null="false" length="255"/>
<property name="uploadDate" type="java.util.Date" column="upload_date" not-null="true"/>
<many-to-one name="mediaType" class="com.mimetics.beans.MediaType"
foreign-key="fk_media_media_types" unique="true" column="type" not-null="true" />
<many-to-one name="owner" class="com.mimetics.beans.User" lazy="proxy"
foreign-key="fk_media_users" column="owner" not-null="true" insert="false" update="false"/>
<set name="receivedComments" lazy="true">
<key not-null="true" column="media_id"/>
<one-to-many class="com.mimetics.beans.Comment" />
</set>
</class>
</hibernate-mapping>
MediaType.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<!-- Indicamos la clase a persistir y la tabla a la que corresponde-->
<class name="com.mimetics.beans.MediaType" table="media_types">
<!-- Especificamos la clave primaria -->
<id name="mediaTypeId" type="java.lang.Integer" column="type_id">
<generator class="native"/>
</id>
<!-- A continuación el resto de atributos -->
<property name="mediaTypeName" type="java.lang.String" column="type_name" not-null="true"/>
</class>
</hibernate-mapping>
User.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<class name="com.mimetics.beans.User" table="users">
<id name="email" type="java.lang.String" column="email">
<generator class="native"/>
</id>
<property name="name" type="java.lang.String" column="name" not-null="true" length="45"/>
<property name="surname" type="java.lang.String" column="surname" not-null="true" length="45"/>
<property name="country" type="java.lang.String" column="country" not-null="true" length="255"/>
<property name="nickname" type="java.lang.String" column="nickname" not-null="true" length="45"/>
<property name="password" type="java.lang.String" column="password" not-null="true" length="12"/>
<many-to-one name="userPreferences" class="com.mimetics.beans.UserPreferences"
foreign-key="fk_user_user_preferences" column="preferences" not-null="true"/>
<many-to-one name="userType" class="com.mimetics.beans.UserType"
foreign-key="fk_user_user_types" column="type" not-null="true"/>
<!-- Collection Sets -->
<set name="uploadedMedia" inverse="true" lazy="true">
<key not-null="true" column="owner"/>
<one-to-many class="com.mimetics.beans.Media"/>
</set>
<!-- SENT & RECEIVED MESSAGES -->
<set name="sentMessages" table="messages" lazy="true">
<key not-null="true" column="from"/>
<one-to-many class="com.mimetics.beans.Message"/>
</set>
<set name="receivedMessages" table="messages" lazy="true">
<key not-null="true" column="to"/>
<one-to-many class="com.mimetics.beans.Message"/>
</set>
<set name="postedComments" lazy="true">
<key not-null="true" column="email"/>
<one-to-many class="com.mimetics.beans.Comment" />
</set>
</class>
</hibernate-mapping>
UserType.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<!-- Indicamos la clase a persistir y la tabla a la que corresponde-->
<class name="com.mimetics.beans.UserType" table="user_types">
<!-- Especificamos la clave primaria -->
<id name="userTypeId" type="java.lang.Integer" column="type_id">
<generator class="native"/>
</id>
<!-- A continuación el resto de atributos -->
<property name="userTypeName" type="java.lang.String" column="type_name" not-null="true"/>
<many-to-one name="userPrivileges" class="com.mimetics.beans.UserPrivileges" column="privileges" unique="true"/>
</class>
</hibernate-mapping>
UserPreferences.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<class name="com.mimetics.beans.UserPreferences" table="user_preferences">
<id name="userPreferencesId" type="java.lang.Long" column="preference_id">
<generator class="native"/>
</id>
<property name="toolboxOrder" type="java.lang.String" not-null="true" column="toolbar_order"/>
<property name="rbarOrder" type="java.lang.String" not-null="true" column="rbar_order"/>
<property name="showComments" type="java.lang.Boolean" not-null="true" column="show_comments"/>
<property name="showEmail" type="java.lang.Boolean" not-null="true" column="show_email"/>
</class>
</hibernate-mapping>
UserPrivileges.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<!-- Indicamos la clase a persistir y la tabla a la que corresponde-->
<class name="com.mimetics.beans.UserPrivileges" table="user_privileges">
<!-- Especificamos la clave primaria -->
<id name="privilegeId" type="java.lang.Long" column="privilege_id">
<generator class="native"/>
</id>
<!-- A continuación el resto de atributos -->
<property name="convertVideo" type="java.lang.Boolean" column="convert_video" not-null="true"/>
<property name="convertAudio" type="java.lang.Boolean" column="convert_audio" not-null="true"/>
<property name="convertImage" type="java.lang.Boolean" column="convert_image" not-null="true"/>
<property name="conserveFiles" type="java.lang.Boolean" column="conserve_files" not-null="true"/>
<property name="maxFSize" type="java.lang.Long" column="max_fsize" not-null="true" />
<property name="canSendMsg" type="java.lang.Boolean" column="can_send_msg" not-null="true"/>
</class>
</hibernate-mapping>
Comment.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<!-- Indicamos la clase a persistir y la tabla a la que corresponde-->
<class name="com.mimetics.beans.Comment" table="comments">
<!-- Especificamos la clave primaria -->
<id name="commentId" type="java.lang.Long" column="comment_Id">
<generator class="native"/>
</id>
<!-- A continuación el resto de atributos -->
<property name="text" type="java.lang.String" column="comment_text" not-null="true" length="255"/>
<property name="postDate" type="java.util.Date" column="post_date" not-null="true" length="255"/>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
Code:
public class Setup extends Action
{
ManagersFactory mFactory = null;
Collection topTen = null;
Session session = null;
public ActionForward execute (ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
ServletContext sCtx = request.getSession ().getServletContext ();
SessionFactory sFactory = (SessionFactory)sCtx.getAttribute (HibernatePlugIn.SESSION_FACTORY_KEY);
mFactory = (ManagersFactory) sCtx.getAttribute (ManagersPlugIn.MANAGERS_FACTORY_KEY);
session = sFactory.openSession ();
if (session.isOpen ())
{
//topTen = new ArrayList();
MediaManager mediaManager = (MediaManager) mFactory.getManager (session,"com.mimetics.managers.MediaManager");
topTen = mediaManager.getTopTenMedia ();
request.setAttribute ("topTenMedia",topTen);
}
return (mapping.findForward ("setup.successfull"));
}
}
ManagersFactory and SessionFactory are loaded as StrutsPlugIns and stored in servlet context. Here is the code:
IManager.javaCode:
public interface IManager
{
public Session getSession ();
public void begin ();
public void end ();
public void commit ();
public void rollback ();
}
ManagersFactory.javaCode:
public class ManagersFactory
{
/** Creates a new instance of ManagersFactory */
public ManagersFactory ()
{
}
public IManager getManager (Session session, String managerType)
{
IManager imanager = null;
try
{
Class cls = Class.forName (managerType);
Class ctorTypes [] = new Class[1];
ctorTypes [0] = Session.class;
Constructor ctor = cls.getConstructor (ctorTypes);
Object ctorArgs[] =new Object [1];
ctorArgs[0] = session;
imanager = (IManager)ctor.newInstance (ctorArgs);
}
catch (Exception ex)
{
ex.printStackTrace (System.out);
}
return imanager;
}
}
Manager.javaCode:
public class Manager implements IManager
{
private Session session = null;
/**
* Creates a new instance of Manager
*/
public Manager (Session session)
{
this.session = session;
}
public Session getSession ()
{
return this.session;
}
public void begin ()
{
if (this.getSession () != null)
this.getSession ().beginTransaction ();
}
public void commit ()
{
if (this.getSession () != null)
this.getSession ().getTransaction ().commit ();
}
public void rollback ()
{
if (this.getSession () != null)
{
try
{
this.getSession ().getTransaction ().rollback ();
}
catch (HibernateException hbex2)
{
StringBuffer exception = new StringBuffer ("Couldn't do rollback(): ");
exception.append (hbex2.toString ());
System.out.println (exception.toString ());
}
try
{
this.getSession ().close ();
}
catch (HibernateException hbex3)
{
StringBuffer exception = new StringBuffer ("Error clossing session!: ");
exception.append (hbex3.toString ());
System.out.println (exception.toString ());
}
}
}
public void end ()
{
Session session = this.getSession ();
if (session != null)
session.close ();
}
}
MediaManager.javaCode:
public class MediaManager extends Manager
{
private Session session;
/** Creates a new instance of MediaManager */
public MediaManager (Session session)
{
super (session);
}
public Media getMediaById (Long mediaId )
{
super.begin ();
Media media = (Media) this.session.get (Media.class, mediaId);
super.end ();
return media;
}
public List<Media> getTopTenMedia ()
{
List topTen = null;
Criteria crit = null;
super.begin ();
String queryString = new String ("from Media as med order by med.views asc");
crit = super.getSession ().createCriteria (Media.class);
crit.setMaxResults (10);
topTen = crit.list ();
super.end ();
return topTen;
}
}
Full stack trace of any exception that occurs:
org.hibernate.exception.GenericJDBCException: could not execute query
org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.loader.Loader.doList(Loader.java:2214)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
org.hibernate.loader.Loader.list(Loader.java:2090)
org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:95)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
com.mimetics.managers.MediaManager.getTopTenMedia(MediaManager.java:43)
com.mimetics.actions.Setup.execute(Setup.java:48)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:446)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
Name and version of the database you are using: MySQL 5.0.27
The generated SQL (show_sql=true):
Hibernate: select this_.media_id as media1_4_4_, this_.filename as filename4_4_, this_.file_size as file3_4_4_, this_.file_size_mb as file4_4_4_, this_.path as path4_4_, this_.description as descript6_4_4_, this_.views as views4_4_, this_.title as title4_4_, this_.tags as tags4_4_, this_.upload_date as upload10_4_4_, this_.type as type4_4_, this_.owner as owner4_4_, mediatype2_.type_id as type1_5_0_, mediatype2_.type_name as type2_5_0_, user3_.email as email0_1_, user3_.name as name0_1_, user3_.surname as surname0_1_, user3_.country as country0_1_, user3_.nickname as nickname0_1_, user3_.password as password0_1_, user3_.preferences as preferen7_0_1_, user3_.type as type0_1_, userprefer4_.preference_id as preference1_3_2_, userprefer4_.toolbar_order as toolbar2_3_2_, userprefer4_.rbar_order as rbar3_3_2_, userprefer4_.show_comments as show4_3_2_, userprefer4_.show_email as show5_3_2_, usertype5_.type_id as type1_1_3_, usertype5_.type_name as type2_1_3_, usertype5_.privileges as privileges1_3_ from media this_ inner join media_types mediatype2_ on this_.type=mediatype2_.type_id inner join users user3_ on this_.owner=user3_.email left outer join user_preferences userprefer4_ on user3_.preferences=userprefer4_.preference_id left outer join user_types usertype5_ on user3_.type=usertype5_.type_id limit ?
And I think that's all the information I can give, If you need something else, just post here and ask me.
I'm getting that strange exception and I don't know why. Also I would like to know what do you think of my approach for abstracting hibernate handling from Struts and the presentation layer.
Thanks in advance to any responses :) .