在liferay数据库中更新用户信息

时间:2013-05-06 06:02:22

标签: database liferay

我需要以编程方式更新数据库中现有用户的信息 我需要更新Liferay数据库中用户表中的用户名出生日期值 基本上我需要运行更新查询。

4 个答案:

答案 0 :(得分:7)

不建议直接更新liferay数据库,您应该使用Liferay API来执行这些操作。根据{{​​3}}:

  

Liferay数据库因某种原因未发布。原因是API比简单的SQL插入语句要多得多。有内部管理的外键,有些东西不仅在数据库中更新,还在索引中,在jackrabbit等中更新。

     

由于所有这些都是由代码而不是数据库管理的,因此对代码的任何更新都将改变数据库更新的方式和时间。即使它在6.1 GA1版本中适用于您,GA2也会在几周内推出,数据库/代码可能会再次发生变化。

     

坚持使用API​​是确保更改正确完成的唯一方法。

足够好的讲道和回到你的问题,这里有一些方法可以做到这些:

  1. 您可以构建自定义portlet并使用liferay的服务,并使用UserLocalServiceUtil.updateUser()方法更新用户名,生日等。
  2. 或者您可以构建基于SOAP或JSON的Web服务客户端来更新调用相同方法的详细信息
  3. 或者您可以使用this liferay forum post从控制面板执行此操作,以下是一些更新用户的代码(仅为您创建 ASAP ):

    import com.liferay.portal.model.Company;
    import com.liferay.portal.model.Contact;
    import com.liferay.portal.model.ContactConstants;
    import com.liferay.portal.model.User;
    import com.liferay.portal.service.CompanyLocalServiceUtil;
    import com.liferay.portal.service.ContactLocalServiceUtil;
    import com.liferay.portal.service.UserLocalServiceUtil;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    
    long companyId = 10135; // this would be different for you
    
    User user = UserLocalServiceUtil.getUserByEmailAddress(companyId, "test@liferay.com");
    
    // Updating User's details
    
    user.setEmailAddress("myTest@liferay.com");
    user.setFirstName("First Test");
    user.setLastName("Last Test");
    user.setScreenName("myTestScreenName");
    
    UserLocalServiceUtil.updateUser(user, false);
    
    // Updating User's Birthday
    
    // December 12, 1912
    int birthdayMonth = 11;
    int birthdayDay = 12;
    int birthdayYear = 1912;
    
    Calendar cal = new GregorianCalendar();
    cal.set(birthdayYear, birthdayMonth, birthdayDay, 0, 0, 0);
    cal.set(Calendar.MILLISECOND, 0);
    
    Date birthday = cal.getTime();    
    
    System.out.println("Updated User: " + user + "\nBirthdate to be updated: " + birthday);
    
    long contactId = user.getContactId();
    
    Contact contact = ContactLocalServiceUtil.getContact(contactId);
    
    if(contact == null) {
    
        contact = ContactLocalServiceUtil.createContact(contactId);
    
        Company company = CompanyLocalServiceUtil.getCompany(user.getCompanyId());
    
        contact.setCompanyId(user.getCompanyId());
        contact.setUserName(StringPool.BLANK);
        contact.setCreateDate(new Date());
        contact.setAccountId(company.getAccountId());
        contact.setParentContactId(ContactConstants.DEFAULT_PARENT_CONTACT_ID);
    }
    
    contact.setModifiedDate(new Date());
    contact.setBirthday(birthday);
    
    ContactLocalServiceUtil.updateContact(contact, false);
    
    System.out.println("Users birthdate updated successfully");
    

    联系人代码是在Liferay的Liferay's Beanshell tool方法

  4. 的源代码的帮助下构建的

    如果您想知道什么是bean-shell以及放置此代码的位置,可以在Liferay控制面板中找到它控制面板 - > 服务器 - > 服务器管理 - > 脚本

    Liferay Beanshell

答案 1 :(得分:5)

这取决于您是否必须在portlet代码中执行此操作或通过向db发送直接查询。

Liferay基本上缓存了所有内容,因此如果在门户网站运行时更新Liferay数据库中的记录,则很可能该记录已经在缓存中,因此根本不会读取新列值。您必须转到控制面板 - >清除数据库缓存。服务器管理。

相反,如果您必须在portlet代码中执行此类操作,则调用Liferay服务的其中一种方法。您正在尝试更新用户,因此您应该调用方法UserLocalServiceUtil.updateUser(如果您还想检查权限,则调用UserServiceUtil.updateUser)。 您可以看到有一些不同的updateUser方法,其中一个有很多参数,另一个只有bean作为参数。虽然第一个包含所有业务逻辑(验证,重新索引,相关实体的更新等),但第二个只是自动生成,不应该使用(除非您完全知道自己在做什么)。因此,如果您不想更改该列的值,请使用包含大量参数的方法,只需传递user.getCOLUMN()(例如user.getFacebookId())。

希望它有所帮助,抱歉我的英语不好......

答案 2 :(得分:2)

update user_ set firstName="New First Name", lastName="New Last Name" where emailAddress="test@test.com";
update contact_ set birthday="date string" where contactId in(select contactId from user_ where emailAddress="test@test.com");

通过第一次更新查询,您可以更改用户的firstName,lastName,通过第二次查询,您可以更改用户的生日。

希望它清楚!

答案 3 :(得分:2)

试试这段代码..

这里我只更新用户名字(你可以按自己的方式休息)

userId =您可以使用主题展示

来获取此内容
User user = UserLocalServiceUtil.getUser(userId);
user.setFirstName("new name");
UserLocalServiceUtil.updateUser(user);

希望这会对你有帮助!!!