Help

Controls

PermLinkWikiLink

Built with Seam

You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.

Forum: Seam Users Forum ListTopic List
19. Aug 2008, 16:02 CET | Link

When creating a new userAccount object using identity manager in seam SVN latest copy, i am getting duplicate userAccount/userRole mappings created when i merge the userAccount object after setting the customer on the userAccount.

My example is basically the same as the seamspace MemberAcount/Member example, where userAccount is MemberAccount and Customer is Member.

Once i remove the merge line (commented out below), i get only a single userAccount/userRole mapping and everything works fine.

Here is the code:

	/**
	 * Create user account, log the user in, and display
	 */
	public void end() 
	{  
		new RunAsOperation() {
			public void execute() {
				identityManager.createUser(customer.getEmail(), password);
				identityManager.grantRole(customer.getEmail(), "user");
			}
		}.run();

		entityManager.persist(customer);
          
		userAccount.setCustomer(customer);
		//entityManager.merge(userAccount);

		// Login the user
		identity.setUsername(userAccount.getUserName());
		identity.setPassword(password);
		identity.login();
   }
	
	
	@Observer(JpaIdentityStore.EVENT_USER_CREATED)
	   public void accountCreated(UserAccount account)
	   {
			this.userAccount = account;
	   }
@Entity
@Table(name = "user_account", catalog = "solarbay")
public class UserAccount implements java.io.Serializable {

	private Long userAccountId;
	private String userName;
	private String passwordHash;
	private boolean enabled;
	private Set<UserRole> roles = new HashSet<UserRole>(10);
	
	private Customer customer;
	private Generator generator;

	public UserAccount() {
	}

	public UserAccount(String userName, String passwordHash) {
		this.userName = userName;
		this.passwordHash = passwordHash;
	}
	public UserAccount(String userName, String passwordHash, boolean enabled,
			Set<UserRole> roles) {
		this.userName = userName;
		this.passwordHash = passwordHash;
		this.enabled = enabled;
		this.roles = roles;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "user_account_id", unique = true, nullable = false)
	public Long getUserAccountId() {
		return this.userAccountId;
	}

	public void setUserAccountId(Long userAccountId) {
		this.userAccountId = userAccountId;
	}

	@UserPrincipal
	@Column(name = "user_name", nullable = false, length = 100)
	@NotNull
	@Length(max = 100)
	public String getUserName() {
		return this.userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	@UserPassword(hash = "md5")
	@Column(name = "password_hash", nullable = true, length = 200)
	@Length(max = 200)
	public String getPasswordHash() {
		return this.passwordHash;
	}

	public void setPasswordHash(String passwordHash) {
		this.passwordHash = passwordHash;
	}

	@UserEnabled
	@Column(name = "enabled")
	@Type(type = "yes_no")
	public boolean isEnabled() {
		return enabled;
	}

	public void setEnabled(boolean enabled) {
		this.enabled = enabled;
	}
	@UserRoles
	@ManyToMany(targetEntity = UserRole.class)
	@JoinTable(name = "user_has_user_role", joinColumns = @JoinColumn(name = "user_account_id"), inverseJoinColumns = @JoinColumn(name = "user_role_id"))
	public Set<UserRole> getRoles() {
		return this.roles;
	}

	public void setRoles(Set<UserRole> roles) {
		this.roles = roles;
	}

	/**
	 * @return the customer
	 */
	@OneToOne
	@JoinColumn(name = "customer_id", nullable = true)
	public Customer getCustomer() {
		return customer;
	}

	/**
	 * @param customer the customer to set
	 */
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	/**
	 * @return the generator
	 */
	@OneToOne
	@JoinColumn(name = "generator_id", nullable = true)
	public Generator getGenerator() {
		return generator;
	}

	/**
	 * @param generator the generator to set
	 */
	public void setGenerator(Generator generator) {
		this.generator = generator;
	}
	
	

}
/**
 * UserRole generated by hbm2java
 */
@Entity
@Table(name = "user_role", catalog = "solarbay")
public class UserRole implements java.io.Serializable {

	private Long userRoleId;
	private String name;
	private boolean conditional;
	private Set<UserRole> groups;
	
	
	public UserRole() {
	}

	public UserRole(String name) {
		this.name = name;
	}
	public UserRole(String name, boolean conditional) {
		this.name = name;
		this.conditional = conditional;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "user_role_id", unique = true, nullable = false)
	public Long getUserRoleId() {
		return this.userRoleId;
	}

	public void setUserRoleId(Long userRoleId) {
		this.userRoleId = userRoleId;
	}

	@RoleName
	@Column(name = "name", nullable = false, length = 200)
	@NotNull
	@Length(max = 200)
	public String getName() {
		return this.name;
	}

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

	@RoleGroups
	@ManyToMany(targetEntity = UserRole.class)
	@JoinTable(name = "role_group", joinColumns = @JoinColumn(name = "user_role_id"), inverseJoinColumns = @JoinColumn(name = "member_of"))
	public Set<UserRole> getGroups() {
		return groups;
	}

	public void setGroups(Set<UserRole> groups) {
		this.groups = groups;
	}
	
	
	
	@RoleConditional
	@Column(name = "conditional")
	@Type(type = "yes_no")
	public boolean isConditional() {
		return conditional;
	}

	public void setConditional(boolean conditional) {
		this.conditional = conditional;
	}

	
}