I think the equivalent to the <bean id="theSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
is the org.springframework.orm.jpa.LocalEntityManagerFactoryBean 2011/8/1 [email protected] <[email protected]> > And here is a sample from a DAO the loads the session: > > http://code.google.com/p/ezmodeler/source/browse/branch/i4c_lpp/data/org/i4change/app/data/project/daos/ProjectDaoImpl.java > > The thing is: To implement this all DAOs/Management classes have to be > loaded using Spring Injection. > All those Singleton-Methods *getInstance* in each class should be removed > and replaced by Spring configuration. Only if you do that you can use this > pattern and let spring organize the session. > > Maybe there is a semi solution to load / inject the SessionTemplate into > the DAOs directly, but I think the way in my samples is the standard way to > do it. > > Sebastian > > 2011/8/1 [email protected] <[email protected]> > > Here is the sample: >> >> >> http://code.google.com/p/ezmodeler/source/browse/branch/i4c_lpp/WebContent/WEB-INF/applicationContext.xml >> >> See the *txProxyTemplate* ... >> >> and then in every (ROOT-)Service this proxy Template is injected, for >> example: >> >> http://code.google.com/p/ezmodeler/source/browse/branch/i4c_lpp/WebContent/WEB-INF/services/diagramservice.service.xml >> >> You have to generate Interfaces for the Service Classes to make it work: >> >> http://code.google.com/p/ezmodeler/source/browse/branch/i4c_lpp/src/app/org/i4change/app/remote/IDiagramservice.java >> >> Sebastian >> >> >> >> 2011/8/1 Василий Дегтярев <[email protected]> >> >>> Hello Sebastian, >>> >>> Could you please give me link of samples of implementation from another >>> project. >>> >>> Thanks, >>> Vasiliy. >>> >>> >>> 2011/7/29 [email protected] <[email protected]> >>> >>>> That sounds good. >>>> >>>> Additionally the best way to handle the Session itself would be to let >>>> Spring manage the Session. >>>> Its a bit of refactoring to do it because in the end all Classes should >>>> be injected via Spring so that you can use a Spring template that holds the >>>> SessionContext and inject it into every Class. I can link some samples of >>>> such implementation from another project of mine. >>>> >>>> Sebastian >>>> >>>> >>>> 2011/7/29 Vasya <[email protected]> >>>> >>>>> Hello Sebastian, >>>>> It seems that we should improve openjpa transaction because current >>>>> transaction implementation does not catch openjpa entity transaction >>>>> exceptions. So we propose to add special DAOTransaction class that >>>>> should catch transaction exception and rollback transaction, please >>>>> see example below: >>>>> >>>>> public abstract class DAOTransaction <T> { >>>>> >>>>> >>>>> private T result; >>>>> private EntityManager em; >>>>> >>>>> public DAOTransaction() { >>>>> } >>>>> >>>>> public T execute() throws Exception { >>>>> Object idf = PersistenceSessionUtil.createSession(); >>>>> em = PersistenceSessionUtil.getSession(); >>>>> EntityTransaction transaction = em.getTransaction(); >>>>> if (!transaction.isActive()) { >>>>> transaction.begin(); >>>>> } >>>>> try { >>>>> run(); >>>>> transaction.commit(); >>>>> } >>>>> catch (Exception e) { >>>>> e.printStackTrace(); >>>>> } >>>>> finally { >>>>> if (transaction.isActive()){ >>>>> transaction.rollback(); >>>>> } >>>>> PersistenceSessionUtil.closeSession(idf); >>>>> } >>>>> return result; >>>>> } >>>>> >>>>> public abstract void run(); >>>>> >>>>> public void setResult(T result_) { >>>>> result = result_; >>>>> } >>>>> >>>>> public T getResult() { >>>>> return result; >>>>> } >>>>> >>>>> public EntityManager getEntityManager() { >>>>> return em; >>>>> } >>>>> >>>>> } >>>>> >>>>> >>>>> In this case method Usermanagment.addUser looks like this: >>>>> public Long addUser(final Users usr) { >>>>> try { >>>>> return new DAOTransaction<Users>() { >>>>> public void run() { >>>>> >>>>> setResult(getEntityManager().merge(usr)); >>>>> } >>>>> }.execute().getUser_id(); >>>>> >>>>> } catch (Exception ex2) { >>>>> log.error("[addUser]", ex2); >>>>> } >>>>> return null; >>>>> } >>>>> >>>>> Please let me know your opinion about this. >>>>> >>>>> Thanks, >>>>> Vasiliy. >>>>> >>>>> >>>>> On Jul 27, 2:14 pm, "[email protected]" <[email protected]> >>>>> wrote: >>>>> > I agree with you with some exceptions: >>>>> > >>>>> > Users can login with the login+pwd OR email+pwd, both is accepted. >>>>> > >>>>> > If you query the database for the login, you have to check if >>>>> externalUserId >>>>> > == null. >>>>> > Cause the login and email is only unique for those people that sign >>>>> up >>>>> > through openmeetings. If you sign up by using Facebook, Moodle, >>>>> Joomla, >>>>> > whatever (generally using the SOAP/REST API), you can simulate any >>>>> user and >>>>> > those users "Could" use all the same login/email. So you might have >>>>> 1000 >>>>> > times the same login/email, cause for example somebody uses the SOAP >>>>> API, >>>>> > always sets the same login/email but NEVER an externalUserId (this >>>>> would >>>>> > result in creating a new user in openmeetings every time). As those >>>>> users >>>>> > that are simulated for access via SOAP are not allowed to login via >>>>> the >>>>> > login-shield it does not matter that the login/email is several times >>>>> > duplicated. >>>>> > >>>>> > So you should change your patch to use the same mechanism that I use >>>>> for >>>>> > checking login+email+externalUserId==null. >>>>> > >>>>> > I just do realize that this check is wrong :)) >>>>> > >>>>> > The mechanism should be: >>>>> > If the imported user has externalUserId != null / > 0 => the user >>>>> should be >>>>> > imported WITHOUT checks. Even if duplicated. >>>>> > If the imported user has exteranlUserId == null, then you have to >>>>> query the >>>>> > database if a user with login or email and externalUserId=null does >>>>> already >>>>> > exist, and if so you can use your logic "if user was found we map all >>>>> > events/rooms etc. to user found" >>>>> > >>>>> > 2011/7/27 Maxim Solodovnik <[email protected]> >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > > Hello Sebastian, >>>>> > >>>>> > > Today I planed to check in the code for handling login/emails and >>>>> files >>>>> > > (written and tested by Vasiliy), but found you was ahead of me :) >>>>> > >>>>> > > Your code is slightly differs than ours so I that to ask couple of >>>>> > > questions: >>>>> > > in your code you skip import user data (for all users) if user >>>>> email is >>>>> > > found in the DB. >>>>> > > In our approach we check user login (since email is not required >>>>> field and >>>>> > > ) >>>>> > > and if user was found we map all events/rooms etc. to user found. >>>>> > >>>>> > > I think our code will better suite the following situation: >>>>> > > 1) OM server was installed and full of data (users, organizations, >>>>> events >>>>> > > etc.) >>>>> > > 2) All data was backed up >>>>> > > 3) New version was installed (new DB) >>>>> > > 4) While installation admin entered his username/email (used in the >>>>> old >>>>> > > installation) To make situation more complicated lets imaging the >>>>> system has >>>>> > > more than one admin. Backup/Restore was done by user with "old" id >>>>> not equal >>>>> > > to 1. >>>>> > >>>>> > > As a result user data will not be mapped to the only created admin >>>>> user. >>>>> > >>>>> > > Does it make sense to you? >>>>> > > Could you take a look at the Vasiliy's patch attached (against rev. >>>>> 4007)? >>>>> > >>>>> > > On Mon, Jul 25, 2011 at 14:13, [email protected] < >>>>> > > [email protected]> wrote: >>>>> > >>>>> > >> I have done some tests during the weekend. >>>>> > >> I have some minor changes to the import, the memory consumption >>>>> was >>>>> > >> okay, with Xmx512MB the was no Heap-Space exception. I will commit >>>>> my >>>>> > >> changes tonight but it should be no problem to merge them if you >>>>> have >>>>> > >> updates too, you can proceed in commiting them. >>>>> > >> The folder renaming, I had no chance to look inside that yet. >>>>> > >>>>> > >> .. as well as the activity window. >>>>> > >>>>> > >> You can also see the renewed proposal for Apache incubation here: >>>>> > >>>>> > >> >>>>> http://mail-archives.apache.org/mod_mbox/incubator-general/201107.mbo. >>>>> .. >>>>> > >>>>> > >> Sebastian >>>>> > >>>>> > >> 2011/7/22 [email protected] <[email protected]>: >>>>> > >> > The only problem I see are the login/email cause: >>>>> > >> > Login should be unique so that users can login. >>>>> > >> > We just simply might add a check on that value and skip that >>>>> user if >>>>> > >> > it already exists. >>>>> > >> > Cause otherwise you always have at minimum one duplicate: >>>>> > >> > The user with the ID=1, cause even if you import it directly >>>>> after you >>>>> > >> > did the installation, ONE user always is there. And it would be >>>>> bad to >>>>> > >> > duplicate that one, cause you would not be able to login with >>>>> this >>>>> > >> > (Admin) user again. >>>>> > >>>>> > >> > Sebastian >>>>> > >>>>> > >> > 2011/7/22 Maxim Solodovnik <[email protected]>: >>>>> > >> >> Hello All, >>>>> > >> >> I have checked in the code with id maps, discussed earlier. >>>>> > >> >> It has no check for duplicate users (import done multiple >>>>> times) >>>>> > >> >> I'm not sure how can we protect the DB from such user action >>>>> .... >>>>> > >> >> Even if all data would be checked it would not work in >>>>> following >>>>> > >> situation: >>>>> > >> >> 1) import was performed >>>>> > >> >> 2) some data was edited (using admin) >>>>> > >> >> 3) import was run one more time >>>>> > >> >> Maybe you have any ideas about it? >>>>> > >> >> On Fri, Jul 22, 2011 at 17:42, [email protected] < >>>>> > >> [email protected]> >>>>> > >> >> wrote: >>>>> > >>>>> > >> >>> Okay Vasya, >>>>> > >>>>> > >> >>> regarding the ZIP for the 40.000 Users....this import is not >>>>> the usual >>>>> > >> >>> test-case >>>>> > >>>>> > >> >>> I do not export the Files in it, cause that would result in a >>>>> 80GB ZIP >>>>> > >> >>> file. I do only import/export the database-record in the ZIP. >>>>> I have >>>>> > >> >>> added some option for that. >>>>> > >> >>> You should generate some sample data with some sample rooms. >>>>> > >>>>> > >> >>> From what I understood your import would allow users to import >>>>> the >>>>> > >> >>> same ZIP n-times. >>>>> > >> >>> Or do you add some checks to not duplicate it? >>>>> > >>>>> > >> >>> What happens to users if you import a user twice, cause the >>>>> > >> >>> username/login would exist two times and the Auth-Mechanism >>>>> would not >>>>> > >> >>> work anymore. I think for a phase1 its okay if that fails, >>>>> somebody >>>>> > >> >>> should know that importing the same ZIP twice can result in >>>>> duplicates >>>>> > >> >>> ... >>>>> > >>>>> > >> >>> Sebastian >>>>> > >>>>> > >> >>> 2011/7/22 Vasya <[email protected]>: >>>>> > >> >>> > Hello Sebastian, >>>>> > >>>>> > >> >>> > I have added mapping for ID’s for import. Maxim should be >>>>> submitted >>>>> > >> my >>>>> > >> >>> > changes today. >>>>> > >> >>> > Now I am working on copy the folder of the upload-directory >>>>> from the >>>>> > >> >>> > Backup-ZIP to the disk. >>>>> > >>>>> > >> >>> > Vasiliy. >>>>> > >>>>> > >> >>> > On Jul 21, 4:21 pm, "[email protected]" < >>>>> [email protected]> >>>>> > >> >>> > wrote: >>>>> > >> >>> >> Hi Maxim, >>>>> > >>>>> > >> >>> >> yes this was the thing that I tried to avoid :) Collecting >>>>> all IDs >>>>> > >> and >>>>> > >> >>> >> building lookup tables to see which old id corresponds to >>>>> the >>>>> > >> record >>>>> > >> >>> >> after the import. >>>>> > >>>>> > >> >>> >> The other thing, to import the objects in the correct order >>>>> is >>>>> > >> already >>>>> > >> >>> >> implemented. >>>>> > >>>>> > >> >>> >> Some Issue will be also the uploaded files: There are some >>>>> > >> >>> >> restrictions on the user's profile images. I think they >>>>> have the >>>>> > >> >>> >> userId as folderName in the path. So you can't copy the >>>>> folders >>>>> > >> >>> >> anymore into the disk just by coping the ROOT folder of the >>>>> > >> >>> >> upload-directory from the Backup-ZIP to the disk, cause >>>>> there are >>>>> > >> some >>>>> > >> >>> >> subfolders that contain invalid folderNames that need to be >>>>> > >> >>> >> rewritten/renamed. >>>>> > >>>>> > >> >>> >> We can try that out, its obviously better if it works but >>>>> its a >>>>> > >> rather >>>>> > >> >>> >> big change. >>>>> > >> >>> >> My concern is the same like yours: Could be quite memory >>>>> hungry >>>>> > >> >>> >> process. >>>>> > >>>>> > >> >>> >> I got for example a database with 40.000++ users that I >>>>> need to >>>>> > >> >>> >> import/export. Holding all 40.000 users would not work, >>>>> maybe >>>>> > >> holding >>>>> > >> >>> >> the 40.000 IDs could work. >>>>> > >>>>> > >> >>> >> Sebastian >>>>> > >>>>> > >> >>> >> 2011/7/21 Maxim Solodovnik <[email protected]>: >>>>> > >>>>> > >> >>> >> > Hello Sebastian, Vasiliy >>>>> > >> >>> >> > Instead of creating generator classes I would like to >>>>> propose the >>>>> > >> >>> >> > following >>>>> > >> >>> >> > mechanism: >>>>> > >> >>> >> > 1) Import should be done in "well known" order i.e. >>>>> > >> organisanisations >>>>> > >> >>> >> > are >>>>> > >> >>> >> > imported first then users, then rooms etc. >>>>> > >> >>> >> > 2) While importing certain object id is not set. Instead >>>>> of this >>>>> > >> old >>>>> > >> >>> >> > id and >>>>> > >> >>> >> > new id are stored in hashtable key== oldId, value == >>>>> newId >>>>> > >> >>> >> > 3) While importing objects containing links to "parent >>>>> objects" >>>>> > >> newId >>>>> > >> >>> >> > is >>>>> > >> >>> >> > used using Hashtable created. >>>>> > >> >>> >> > 4) Pictures/streams/videos are stored in the file system >>>>> using >>>>> > >> newId >>>>> > >> >>> >> > The import will be memory consuming operation but all >>>>> constraints >>>>> > >> >>> >> > will be >>>>> > >> >>> >> > valid. >>>>> > >>>>> > >> >>> >> > On Mon, Jul 18, 2011 at 17:46, Vasya < >>>>> [email protected]> >>>>> > >> >>> >> > wrote: >>>>> > >>>>> > >> >>> >> >> Hi Sebastian, >>>>> > >>>>> > >> >>> >> >> Thanks for your answer! >>>>> > >>>>> > >> >>> >> >> I will continue to investigate problem tomorrow. >>>>> > >>>>> > >> >>> >> >> Vasiliy. >>>>> > >>>>> > >> >>> >> >> On Jul 18, 5:32 pm, "[email protected]" < >>>>> > >> [email protected]> >>>>> > >> >>> >> >> wrote: >>>>> > >> >>> >> >> > Hi Vasya, >>>>> > >>>>> > >> >>> >> >> > If tested getBackupRooms yesterday, it was okay for >>>>> me. >>>>> > >>>>> > >> >>> >> >> > The thing with the *deleted* is that it has to return >>>>> ALL >>>>> > >> records, >>>>> > >> >>> >> >> > no >>>>> > >> >>> >> >> > matter if the deleted flag is set or not. >>>>> > >> >>> >> >> > This is the case because of the foreign key >>>>> references. >>>>> > >>>>> > >> >>> >> >> > Just imagine the following sample: >>>>> > >> >>> >> >> > Rooms-Table: >>>>> > >> >>> >> >> > ID name deleted >>>>> > >> >>> >> >> > 1 room1 false >>>>> > >> >>> >> >> > 2 room2 true >>>>> > >> >>> >> >> > 3 room3 false >>>>> > >>>>> > >> >>> >> >> > Rooms-Organizations Table: >>>>> > >> >>> >> >> > ID rooms_id organisation_id >>>>> > >> >>> >> >> > 1 1 1 >>>>> > >> >>> >> >> > 1 2 2 >>>>> > >> >>> >> >> > 1 3 1 >>>>> > >>>>> > >> >>> >> >> > If you only export those records that are deleted == >>>>> 'false' >>>>> > >> >>> >> >> > => the importer would add room3 as the record with the >>>>> ID 2 >>>>> > >> and as >>>>> > >> >>> >> >> > consequence the room would be assigned to the >>>>> organization 2 >>>>> > >> => >>>>> > >> >>> >> >> > which >>>>> > >> >>> >> >> > is wrong of course. >>>>> > >>>>> > >> >>> >> >> > And the same you have between all tables. That is why >>>>> I did >>>>> > >> import >>>>> > >> >>> >> >> > records always WITH all records marked as "deleted" >>>>> AND in the >>>>> > >> >>> >> >> > import >>>>> > >> >>> >> >> > process I did add each object with the ID ALREADY SET. >>>>> That >>>>> > >> means >>>>> > >> >>> >> >> > I >>>>> > >> >>> >> >> > did not use the generated Id from Hibernate, I did use >>>>> the ID >>>>> > >> that >>>>> > >> >>> >> >> > was >>>>> > >> >>> >> >> > provided >>>>> > >>>>> > ... >>>>> > >>>>> > read more » >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "OpenMeetings developers" group. >>>>> To post to this group, send email to [email protected] >>>>> . >>>>> To unsubscribe from this group, send email to >>>>> [email protected]. >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/openmeetings-dev?hl=en. >>>>> >>>>> >>>> >>>> >>>> -- >>>> Sebastian Wagner >>>> http://www.webbase-design.de >>>> http://openmeetings.googlecode.com >>>> http://www.wagner-sebastian.com >>>> [email protected] >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "OpenMeetings developers" group. >>>> To post to this group, send email to [email protected]. >>>> To unsubscribe from this group, send email to >>>> [email protected]. >>>> For more options, visit this group at >>>> http://groups.google.com/group/openmeetings-dev?hl=en. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "OpenMeetings developers" group. >>> To post to this group, send email to [email protected]. >>> To unsubscribe from this group, send email to >>> [email protected]. >>> For more options, visit this group at >>> http://groups.google.com/group/openmeetings-dev?hl=en. >>> >> >> >> >> -- >> Sebastian Wagner >> http://www.webbase-design.de >> http://openmeetings.googlecode.com >> http://www.wagner-sebastian.com >> [email protected] >> > > > > -- > Sebastian Wagner > http://www.webbase-design.de > http://openmeetings.googlecode.com > http://www.wagner-sebastian.com > [email protected] > -- Sebastian Wagner http://www.webbase-design.de http://openmeetings.googlecode.com http://www.wagner-sebastian.com [email protected] -- You received this message because you are subscribed to the Google Groups "OpenMeetings developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/openmeetings-dev?hl=en.
