-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: [Mapping Problem] String-Array mappen - nur wie?
PostPosted: Tue Sep 13, 2005 5:02 am 
Newbie

Joined: Tue Sep 13, 2005 4:51 am
Posts: 2
Hibernate version: 3.05

Mapping documents: Das ist ja gerade das Problem

Code between sessionFactory.openSession() and session.close():

Name and version of the database you are using: MySQL 4.1.14-nt

---

Hallo Forum,

ich bin Anfänger in Sachen Hibernate und stehe momentan vor folgendem Problem:

Folgende Klasse:

Code:
public class User
{
...
   protected String[] roles;
...
}


Nun sieht es so aus, dass ich sämtliche Properties dieser Userklasse auf die User-Table in meiner Datenbank gemappt habe - abgesehen von dem Array roles...

Die Rollen stehen in einer weiteren Tabelle (role) und sind per Foreign Key auf die User ID mit der Usertabelle assoziiert. Nun hätte ich gerne ein Mapping, das mir das Array auf diese Rollen-Tabelle mappt, komme aber nicht so recht weiter.

Ich habe es mit folgendem Mapping versucht:

Code:
<array name="roles" table="role">
   <key column="BENSL" />
   <list-index base="0" />
   <element column="ROLE_NAME" type="java.lang.String" />
</array>


Sobald ich jetzt von einer JSP-Seite aus auf die roles-Property meines (erfolgreich geladenen) User-Objektes zugreifen will werde ich auf meine Error-Seite weitergeleitet, wo ich folgenden Stacktrace zu sehen bekomme:

Code:
could not initialize a collection: [de.mycompany.smvonline.domain.User.roles#gaa9629] org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:70)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.loader.Loader.loadCollection(Loader.java:1441)
org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:99)
org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:488)
org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1430)
org.hibernate.type.CollectionType.getCollection(CollectionType.java:484)
org.hibernate.type.CollectionType.resolveKey(CollectionType.java:332)
org.hibernate.type.CollectionType.resolve(CollectionType.java:326)
org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:105)
org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:530)
org.hibernate.loader.Loader.doQuery(Loader.java:436)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
org.hibernate.loader.Loader.loadEntity(Loader.java:1345)
org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:116)
org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:101)
org.hibernate.persister.entity.BasicEntityPersister.load(BasicEntityPersister.java:2471)
org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:351)
org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:332)
org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:113)
org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:75)
org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:643)
org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:59)
org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:84)
org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:134)
de.allianz.smvonline.domain.User$$EnhancerByCGLIB$$31e9fe5b.getForename()
org.apache.jsp.profile_jsp._jspService(org.apache.jsp.profile_jsp:69)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
de.allianz.smvonline.FetchUserFilter.doFilter(FetchUserFilter.java:62)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
java.lang.Thread.run(Thread.java:595)


Ich schätze ich stelle mich einfach doof an, wäre aber dankbar, wenn mir jemand sagen könnte, wo mein/e Fehler liegt/liegen.

Vielen Dank schonmal,

Chopes


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 13, 2005 6:54 am 
Newbie

Joined: Tue Nov 18, 2003 9:20 am
Posts: 5
Location: Munich/Germany
Hallo Chopes,
ich habe es mal ausprobiert, bei mir funktionierts.
Anbei eine kleine Beispielanwendung (mit Hibernate 3.0.5):

Klasse Actor mit String[]:
Code:
package hib3.ovs.model;

public class Actor {
   private Long id;
   private String name;
   private String[] roles;

   public Long getId() {
      return id;
   }

   public void setId(Long id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String[] getRoles() {
      return roles;
   }

   public void setRoles(String[] roles) {
      this.roles = roles;
   }
}

Konfiguration (Actor.hbm.xml):
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="hib3.ovs.model.Actor" table="ACTOR">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <array name="roles">
           <key column="id" />
           <list-index base="0" />
           <element column="role" type="java.lang.String" />
        </array>
    </class>
</hibernate-mapping>

Main:
Code:
package example;

import hib3.ovs.model.Actor;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Example1 {
   public static void main(String[] args) {
      Configuration c = new Configuration().configure();
      SessionFactory sessionFactory = c.buildSessionFactory();
      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      Actor actor = new Actor();
      actor.setName("Uma Thurman");
      actor.setRoles(new String[] { "A", "B", "C" });
      session.save(actor);
      tx.commit();
      session.close();
   }
}


Ich hoffe das hilft Dir weiter.

Schöne Grüße,
Markus

_________________
-----------------------------------------
Don't forget to rate please...


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 13, 2005 7:42 am 
Newbie

Joined: Tue Sep 13, 2005 4:51 am
Posts: 2
Danke für die Antwort :) Mein Programm sieht insgesamt recht ähnlich aus, ist aber natürlich eine Webapp, die in Tomcat 5.5.9 läuft. Außerdem habe ich das ThreadLocal Session Pattern sowie ein DAO-Pattern implementiert. Der Fehler, den ich oben gepostet habe, erscheint nicht mehr, sobald ich mein Objekt nicht mehr mit Session.load() lade, sondern über eine Query.

Allerdings bekomme ich jetzt eine andere Exception, die mir genauso schleierhaft ist:

Hibernate SQL Output
Code:
select roles0_.BENSL as BENSL0_, roles0_.ROLE_NAME as ROLE2_0_, roles0_.idx as idx0_ from role roles0_ where roles0_.BENSL=?


Dieser Output ist meiner Meinung nach falsch, da ich in meiner Rollentabelle keine Spalte namens idx habe. Folglich geht die Query schief und ich bekomme kein Objejkt...

Stacktrace
Code:
could not initialize a collection: [de.mycompany.smvonline.domain.User.roles#gaa9629]
org.hibernate.exception.SQLGrammarException: could not initialize a collection: [de.mycompany.smvonline.domain.User.roles#gaa9629]
   at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:70)
   at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
   at org.hibernate.loader.Loader.loadCollection(Loader.java:1441)
   at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:99)
   at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:488)
   at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
   at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1430)
   at org.hibernate.type.CollectionType.getCollection(CollectionType.java:484)
   at org.hibernate.type.CollectionType.resolveKey(CollectionType.java:332)
   at org.hibernate.type.CollectionType.resolve(CollectionType.java:326)
   at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:105)
   at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:530)
   at org.hibernate.loader.Loader.doQuery(Loader.java:436)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
   at org.hibernate.loader.Loader.doList(Loader.java:1593)
   at org.hibernate.loader.Loader.list(Loader.java:1577)
   at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:395)
   at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:271)
   at org.hibernate.impl.SessionImpl.list(SessionImpl.java:844)
   at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
   at de.mycompany.smvonline.dao.UserDAO.findByBensl(UserDAO.java:37)
   at de.mycompany.smvonline.FetchUserFilter.doFilter(FetchUserFilter.java:52)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
   at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
   at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
   at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
   at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
   at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
   at java.lang.Thread.run(Thread.java:595)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 13, 2005 7:59 am 
Newbie

Joined: Tue Sep 13, 2005 5:58 am
Posts: 1
Hallo

Chopes wrote:
Dieser Output ist meiner Meinung nach falsch, da ich in meiner Rollentabelle keine Spalte namens idx habe. Folglich geht die Query schief und ich bekomme kein Objejkt...


Vielleicht solltest Du dann den Spaltenname angegeben, etwa so:

Code:
              <index
                  column="IDX_USER_ROLE"
              />


natürlich mit Deiner Indexspalte.

Lässt Du Dir das DB-Schema generieren? Dann sollte die Indexspalte eigentlich richtig sein, ansonsten musst Du Dich selber um die Konsistenz kümmern.

Gruß,
Achim


Top
 Profile  
 
 Post subject: table vielleicht weglassen
PostPosted: Thu Sep 15, 2005 3:43 am 
Newbie

Joined: Mon Dec 13, 2004 4:22 pm
Posts: 6
Hallo,

ich habe mir die post mal angesehen und festgestellt, dass Du in Deinem Mapping-File bei <array/> eine table-Attribut benutzt, das Actor-Beispiel darunter aber nicht. Laß es doch mal weg. Dann sollte das Array als ganzes in der selben Tabelle wie User gespeichert werden in der entsprechenden Column.
Desweiteren verweist das "key-column" Attribut im Actor-Beispiel auf die id von Actor, in Deinem User-Beispiel auf "BENSL" was immer das heißt. Laß auch hier vielleicht mal auf das entsprechende id-Property Deines User-Objektes verweisen.

Probier es aus.

Bis dann.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.