package org.hibernate.brmeyer.demo.entity;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OrderColumn;
import org.hibernate.Hibernate;
import org.hibernate.annotations.BatchSize;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.NaturalId;
/**
* The Class User.
*/
@Entity
public class User {
/** The id. */
@Id
@GeneratedValue
private int id;
/** The email. */
@NaturalId
private String email;
/** The name. */
private String name;
/** The phone. */
private String phone;
/** The community memberships. */
@ManyToMany
private List<Community> communityMemberships = new ArrayList<Community>();
/** The communities created. */
@OneToMany(mappedBy = "creator")
@BatchSize(size = 5)
private List<Community> communitiesCreated = new ArrayList<Community>();
/** The skills. */
@ManyToMany
@Fetch(FetchMode.SUBSELECT)
private List<Skill> skills = new ArrayList<Skill>();
/** The tools. */
@ManyToMany
private List<Tool> tools = new ArrayList<Tool>();
/** The donations. */
@OneToMany(mappedBy = "user")
private List<Donation> donations = new ArrayList<Donation>();
/** The projects submitted. */
@OneToMany(mappedBy = "submitter")
@OrderColumn(name = "projectsSubmitted_index")
private List<Project> projectsSubmitted = new ArrayList<Project>();
/** The projects organized. */
@OneToMany(mappedBy = "organizer")
@OrderColumn(name = "projectsOrganized_index")
private List<Project> projectsOrganized = new ArrayList<Project>();
/** The projects volunteered. */
@ManyToMany(mappedBy = "volunteers")
private List<Project> projectsVolunteered = new ArrayList<Project>();
/** The comments. */
@OneToMany(mappedBy = "submitter")
@LazyCollection(LazyCollectionOption.EXTRA)
@OrderColumn(name = "comments_index") // Index necessary to know which element to lazy-init!
private List<Comment> comments = new ArrayList<Comment>();
/** The service events organized. */
@OneToMany(mappedBy = "organizer")
private List<ServiceEvent> serviceEventsOrganized = new ArrayList<ServiceEvent>();
/**
* Gets the id.
*
* @return the id
*/
public int getId() {
return id;
}
/**
* Sets the id.
*
* @param id the new id
*/
public void setId(int id) {
this.id = id;
}
/**
* Gets the email.
*
* @return the email
*/
public String getEmail() {
return email;
}
/**
* Sets the email.
*
* @param email the new email
*/
public void setEmail(String email) {
this.email = email;
}
/**
* Gets the name.
*
* @return the name
*/
public String getName() {
return name;
}
/**
* Sets the name.
*
* @param name the new name
*/
public void setName(String name) {
this.name = name;
}
/**
* Gets the phone.
*
* @return the phone
*/
public String getPhone() {
return phone;
}
/**
* Sets the phone.
*
* @param phone the new phone
*/
public void setPhone(String phone) {
this.phone = phone;
}
/**
* Gets the community memberships.
*
* @return the community memberships
*/
public List<Community> getCommunityMemberships() {
return communityMemberships;
}
/**
* Sets the community memberships.
*
* @param communityMemberships the new community memberships
*/
public void setCommunityMemberships(List<Community> communityMemberships) {
this.communityMemberships = communityMemberships;
}
/**
* Gets the communities created.
*
* @return the communities created
*/
public List<Community> getCommunitiesCreated() {
return communitiesCreated;
}
/**
* Sets the communities created.
*
* @param communitiesCreated the new communities created
*/
public void setCommunitiesCreated(List<Community> communitiesCreated) {
this.communitiesCreated = communitiesCreated;
}
/**
* Gets the skills.
*
* @return the skills
*/
public List<Skill> getSkills() {
return skills;
}
/**
* Sets the skills.
*
* @param skills the new skills
*/
public void setSkills(List<Skill> skills) {
this.skills = skills;
}
/**
* Gets the tools.
*
* @return the tools
*/
public List<Tool> getTools() {
return tools;
}
/**
* Sets the tools.
*
* @param tools the new tools
*/
public void setTools(List<Tool> tools) {
this.tools = tools;
}
/**
* Gets the projects submitted.
*
* @return the projects submitted
*/
public List<Project> getProjectsSubmitted() {
return projectsSubmitted;
}
/**
* Sets the projects submitted.
*
* @param projectsSubmitted the new projects submitted
*/
public void setProjectsSubmitted(List<Project> projectsSubmitted) {
this.projectsSubmitted = projectsSubmitted;
}
/**
* Gets the projects organized.
*
* @return the projects organized
*/
public List<Project> getProjectsOrganized() {
return projectsOrganized;
}
/**
* Sets the projects organized.
*
* @param projectsOrganized the new projects organized
*/
public void setProjectsOrganized(List<Project> projectsOrganized) {
this.projectsOrganized = projectsOrganized;
}
/**
* Gets the projects volunteered.
*
* @return the projects volunteered
*/
public List<Project> getProjectsVolunteered() {
return projectsVolunteered;
}
/**
* Sets the projects volunteered.
*
* @param projectsVolunteered the new projects volunteered
*/
public void setProjectsVolunteered(List<Project> projectsVolunteered) {
this.projectsVolunteered = projectsVolunteered;
}
/**
* Gets the comments.
*
* @return the comments
*/
public List<Comment> getComments() {
return comments;
}
/**
* Sets the comments.
*
* @param comments the new comments
*/
public void setComments(List<Comment> comments) {
this.comments = comments;
}
/**
* Gets the donations.
*
* @return the donations
*/
public List<Donation> getDonations() {
return donations;
}
/**
* Sets the donations.
*
* @param donations the new donations
*/
public void setDonations(List<Donation> donations) {
this.donations = donations;
}
/**
* Gets the service events organized.
*
* @return the service events organized
*/
public List<ServiceEvent> getServiceEventsOrganized() {
return serviceEventsOrganized;
}
/**
* Sets the service events organized.
*
* @param serviceEventsOrganized the new service events organized
*/
public void setServiceEventsOrganized(List<ServiceEvent> serviceEventsOrganized) {
this.serviceEventsOrganized = serviceEventsOrganized;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append( "\nName: " ).append( name );
sb.append( "\nEmail: " ).append( email );
sb.append( "\nPhone: " ).append( phone );
if (Hibernate.isInitialized( tools )) {
for (Tool tool : tools) {
sb.append( "\nTool: " ).append( tool.getName() );
}
}
if (Hibernate.isInitialized( skills )) {
for (Skill skill : skills) {
sb.append( "\nSkill: " ).append( skill.getName() );
}
}
return sb.toString();
}
}