HibernateRelationships |
|
Your trail: |
This is version 54.
It is not the current version, and thus it cannot be edited.
[Back to current version]
[Restore this version]
About this tutorial
This is a tutorial to show how to create and manage Hibernate relationships within AppFuse. This tutorial was written for AppFuse 1.8 and the AppGen pieces may not work with previous versions.
- For further details about the specifics regarding creating entities, XDoclet tags for Hibernate, DAO development, etc., please refer to Creating new DAOs and Objects in AppFuse.
Table of Contents
- Create Weblog.java, Entry.java and add XDoclet tags
- [Many-to-One] Create a new Category object and modify Entry.java to use it
- [One-to-Many] A Weblog object can have many Entries
- [Many-to-Many] Shared Weblogs are possible for multiple Users
- Lazy-Loading Issues
- Managing relationships and indexed properties in the UI
Create Weblog.java, Entry.java and add XDoclet tags
For our purposes, the Weblog entity is a list of available weblogs. A Weblog object has the following properties an id, a username (for the user who created the blog), a dateCreated, and a blogTitle. Every Entry object has an id, a text, and a timeCreated property.
The first thing to do is create some objects to persist. Let's create both a "Weblog" object and an Entry object (in the src/dao/**/model directory). Basic XDoclet tags for these entities are show as well.
package org.appfuse.model;
import java.util.Date;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @hibernate.class table="weblog"
*/
public class Weblog extends BaseObject {
private Long weblogId;
private String username;
private Date dateCreated;
private String blogTitle;
private Integer version;
/**
* @return Returns the blogTitle.
*
* @hibernate.property column="blog_title"
*/
public String getBlogTitle() {
return blogTitle;
}
/**
* @param blogTitle
* The blogTitle to set.
*/
public void setBlogTitle(String blogTitle) {
this.blogTitle = blogTitle;
}
/**
* @return Returns the dateCreated.
*
* @hibernate.property column="date_created"
*/
public Date getDateCreated() {
return dateCreated;
}
/**
* @param dateCreated
* The dateCreated to set.
*/
public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
/**
* @return Returns the id.
*
* @hibernate.id column="weblog_id" generator-class="native"
* unsaved-value="null"
*/
public Long getWeblogId() {
return weblogId;
}
/**
* @param id
* The id to set.
*/
public void setWeblogId(Long weblogId) {
this.weblogId = weblogId;
}
/**
* @return Returns the username.
*
* @hibernate.property column="username"
*/
public String getUsername() {
return username;
}
/**
* @param username
* The username to set.
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return Returns the version.
*
* @hibernate.version
*/
public Integer getVersion() {
return version;
}
/**
* @param version
* The version to set.
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(Object object) {
if (!(object instanceof Weblog)) {
return false;
}
Weblog rhs = (Weblog) object;
return new EqualsBuilder().append(this.blogTitle, rhs.blogTitle)
.append(this.username, rhs.username).append(this.dateCreated,
rhs.dateCreated).append(this.weblogId, rhs.weblogId).append(
this.version, rhs.version).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return new HashCodeBuilder(2066507029, -390167195).append(
this.blogTitle).append(this.username).append(this.dateCreated)
.append(this.weblogId).append(this.version).toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", this.weblogId).append("version", this.version).append(
"username", this.username).append("blogTitle",
this.blogTitle).append("dateCreated", this.dateCreated)
.toString();
}
}
|
package org.appfuse.model;
import java.util.Date;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @hibernate.class table="entry"
*/
public class Entry extends BaseObject {
private Long id;
private String text;
private Date timeCreated;
private Integer version;
/*
* Generate your getters and setters using your favorite IDE: In Eclipse:
* Right-click -> Source -> Generate Getters and Setters
*/
/**
* @return Returns the id.
*
* @hibernate.id column="entry_id" generator-class="native"
* unsaved-value="null"
*/
public Long getEntryId() {
return entryId;
}
/**
* @param id
* The id to set.
*/
public void setEntryId(Long entryId) {
this.entryId = entryId;
}
/**
* @return Returns the text.
*
* @hibernate.property column="entry_text"
*/
public String getText() {
return text;
}
/**
* @param text
* The text to set.
*/
public void setText(String text) {
this.text = text;
}
/**
* @return Returns the timeCreated.
*
* @hibernate.property column="time_created"
*/
public Date getTimeCreated() {
return timeCreated;
}
/**
* @param timeCreated
* The timeCreated to set.
*/
public void setTimeCreated(Date timeCreated) {
this.timeCreated = timeCreated;
}
/**
* @return Returns the version.
*
* @hibernate.version
*/
public Integer getVersion() {
return version;
}
/**
* @param version
* The version to set.
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(Object object) {
if (!(object instanceof Entry)) {
return false;
}
Entry rhs = (Entry) object;
return new EqualsBuilder().append(this.text, rhs.text).append(
this.timeCreated, rhs.timeCreated).append(this.id, rhs.id)
.append(this.version, rhs.version).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return new HashCodeBuilder(-880342185, -1668369001).append(this.text)
.append(this.timeCreated).append(this.id).append(this.version)
.toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("text", this.text).append("id", this.id).append(
"version", this.version).append("timeCreated",
this.timeCreated).toString();
}
}
|
[Many-to-One] Create a new Category object and modify Entry.java to use it
A category object will act as an entity for persisting category information about weblog entries. A category object will consist of an id (primary key), category name, and a description. Each category can have many entries.
package org.appfuse.model;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @hibernate.class table="category"
*/
public class Category extends BaseObject {
private Long id;
private String categoryName;
private String categoryDescription;
private Integer version;
/**
* @return Returns the categoryDescription.
*
* @hibernate.property column="category_description"
*/
public String getCategoryDescription() {
return categoryDescription;
}
/**
* @param categoryDescription
* The categoryDescription to set.
*/
public void setCategoryDescription(String categoryDescription) {
this.categoryDescription = categoryDescription;
}
/**
* @return Returns the categoryName.
*
* @hibernate.property column="category_name"
*/
public String getCategoryName() {
return categoryName;
}
/**
* @param categoryName
* The categoryName to set.
*/
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
/**
* @return Returns the id.
*
* @hibernate.id column="category_id" generator-class="native"
* unsaved-value="null"
*/
public Long getId() {
return id;
}
/**
* @param id
* The id to set.
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return Returns the version.
*
* @hibernate.version
*/
public Integer getVersion() {
return version;
}
/**
* @param version
* The version to set.
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(Object object) {
if (!(object instanceof Category)) {
return false;
}
Category rhs = (Category) object;
return new EqualsBuilder().append(this.categoryDescription,
rhs.categoryDescription).append(this.categoryName,
rhs.categoryName).append(this.id, rhs.id).append(this.version,
rhs.version).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return new HashCodeBuilder(-837614407, -1874103513).append(
this.categoryDescription).append(this.categoryName).append(
this.id).append(this.version).toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", this.id)
.append("categoryName", this.categoryName).append("version",
this.version).append("categoryDescription",
this.categoryDescription).toString();
}
}
|
The many-to-one relationship between entry and category can be established by the entity classes. Hibernate relationships can typically be established on either side of the relationship or as a bi-directional one as well. For our purposes,this relationship will be maintained by an extra property and collection held by Entry.
package org.appfuse.model;
import java.util.Date;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @hibernate.class table="entry"
*/
public class Entry extends BaseObject {
private Long entryId;
private String text;
private Date timeCreated;
private Integer version;
private Long categoryId;
private Category category;
/*
* Generate your getters and setters using your favorite IDE: In Eclipse:
* Right-click -> Source -> Generate Getters and Setters
*/
/**
* @return Returns the category.
*
* @hibernate.many-to-one insert="false" update="false" cascade="none"
* column="category_id" outer-join="true"
*/
public Category getCategory() {
return category;
}
/**
* @param category
* The category to set.
*/
public void setCategory(Category category) {
this.category = category;
}
/**
* @return Returns the categoryId.
*
* @hibernate.property column="category_id"
*/
public Long getCategoryId() {
return categoryId;
}
/**
* @param categoryId
* The categoryId to set.
*
*/
public void setCategoryId(Long categoryId) {
this.categoryId = categoryId;
}
/**
* @return Returns the id.
*
* @hibernate.id column="entry_id" generator-class="native"
* unsaved-value="null"
*/
public Long getEntryId() {
return entryId;
}
/**
* @param id
* The id to set.
*/
public void setEntryId(Long entryId) {
this.entryId = entryId;
}
/**
* @return Returns the text.
*
* @hibernate.property column="entry_text"
*/
public String getText() {
return text;
}
/**
* @param text
* The text to set.
*/
public void setText(String text) {
this.text = text;
}
/**
* @return Returns the timeCreated.
*
* @hibernate.property column="time_created"
*/
public Date getTimeCreated() {
return timeCreated;
}
/**
* @param timeCreated
* The timeCreated to set.
*/
public void setTimeCreated(Date timeCreated) {
this.timeCreated = timeCreated;
}
/**
* @return Returns the version.
*
* @hibernate.version
*/
public Integer getVersion() {
return version;
}
/**
* @param version
* The version to set.
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(Object object) {
if (!(object instanceof Entry)) {
return false;
}
Entry rhs = (Entry) object;
return new EqualsBuilder().append(this.text, rhs.text).append(
this.timeCreated, rhs.timeCreated).append(this.category,
rhs.category).append(this.entryId, rhs.entryId).append(
this.categoryId, rhs.categoryId).append(this.version,
rhs.version).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return new HashCodeBuilder(835056587, 1192670387).append(this.text)
.append(this.timeCreated).append(this.category).append(
this.entryId).append(this.categoryId).append(
this.version).toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("text", this.text).append("entryId", this.entryId)
.append("version", this.version).append("categoryId",
this.categoryId).append("category", this.category)
.append("timeCreated", this.timeCreated).toString();
}
}
|
[One-to-Many] A Weblog object can have many Entries
Modify the Weblog object and Entry object to represent the multiplicity of a weblog that can have many entries. This relationship is set on the Weblog class using a list. Hibernate tags are used to establish this relationship using a bag as the Hibernate collection type.
package org.appfuse.model;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @hibernate.class table="weblog"
*/
public class Weblog extends BaseObject {
private Long weblogId;
private String username;
private Date dateCreated;
private String blogTitle;
private Integer version;
private List entries;
/**
* @return Returns the blogTitle.
*
* @hibernate.property column="blog_title"
*/
public String getBlogTitle() {
return blogTitle;
}
/**
* @param blogTitle
* The blogTitle to set.
*/
public void setBlogTitle(String blogTitle) {
this.blogTitle = blogTitle;
}
/**
* @return Returns the dateCreated.
*
* @hibernate.property column="date_created"
*/
public Date getDateCreated() {
return dateCreated;
}
/**
* @param dateCreated
* The dateCreated to set.
*/
public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
/**
* @return Returns the entries.
*
* @hibernate.bag name="entries" lazy="true" inverse="true"
* cascade="delete"
* @hibernate.collection-key column="entry_id"
* @hibernate.collection-one-to-many
* class="org.appfuse.model.Entry"
*/
public List getEntries() {
return entries;
}
/**
* @param entries
* The entries to set.
*/
public void setEntries(List entries) {
this.entries = entries;
}
/**
* @return Returns the id.
*
* @hibernate.id column="weblog_id" generator-class="native"
* unsaved-value="null"
*/
public Long getWeblogId() {
return weblogId;
}
/**
* @param id
* The id to set.
*/
public void setWeblogId(Long weblogId) {
this.weblogId = weblogId;
}
/**
* @return Returns the username.
*
* @hibernate.property column="username"
*/
public String getUsername() {
return username;
}
/**
* @param username
* The username to set.
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return Returns the version.
*
* @hibernate.version
*/
public Integer getVersion() {
return version;
}
/**
* @param version
* The version to set.
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(Object object) {
if (!(object instanceof Weblog)) {
return false;
}
Weblog rhs = (Weblog) object;
return new EqualsBuilder().append(this.blogTitle, rhs.blogTitle)
.append(this.weblogId, rhs.weblogId).append(this.username,
rhs.username).append(this.entries, rhs.entries).append(
this.dateCreated, rhs.dateCreated).append(this.version,
rhs.version).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return new HashCodeBuilder(-1412256665, -696169811).append(
this.blogTitle).append(this.weblogId).append(this.username)
.append(this.entries).append(this.dateCreated).append(
this.version).toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("weblogId", this.weblogId).append("version",
this.version).append("username", this.username).append(
"blogTitle", this.blogTitle).append("entries",
this.entries).append("dateCreated", this.dateCreated)
.toString();
}
}
|
The Entry class is modified slightly to provide a placeholder for the relationships between Weblog and Entry.
package org.appfuse.model;
import java.util.Date;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @hibernate.class table="entry"
*/
public class Entry extends BaseObject {
private Long entryId;
private String text;
private Date timeCreated;
private Integer version;
private Category category;
private Long categoryId;
private Long weblogId;
/*
* Generate your getters and setters using your favorite IDE: In Eclipse:
* Right-click -> Source -> Generate Getters and Setters
*/
/**
* @return Returns the category.
*
* @hibernate.many-to-one insert="false" update="false" cascade="none"
* column="category_id" outer-join="true"
*/
public Category getCategory() {
return category;
}
/**
* @param category
* The category to set.
*/
public void setCategory(Category category) {
this.category = category;
}
/**
* @return Returns the categoryId.
*
* @hibernate.property column="category_id"
*/
public Long getCategoryId() {
return categoryId;
}
/**
* @param categoryId
* The categoryId to set.
*
*/
public void setCategoryId(Long categoryId) {
this.categoryId = categoryId;
}
/**
* @return Returns the id.
*
* @hibernate.id column="entry_id" generator-class="native"
* unsaved-value="null"
*/
public Long getEntryId() {
return entryId;
}
/**
* @param id
* The id to set.
*/
public void setEntryId(Long entryId) {
this.entryId = entryId;
}
/**
* @return Returns the text.
*
* @hibernate.property column="entry_text"
*/
public String getText() {
return text;
}
/**
* @param text
* The text to set.
*/
public void setText(String text) {
this.text = text;
}
/**
* @return Returns the timeCreated.
*
* @hibernate.property column="time_created"
*/
public Date getTimeCreated() {
return timeCreated;
}
/**
* @param timeCreated
* The timeCreated to set.
*/
public void setTimeCreated(Date timeCreated) {
this.timeCreated = timeCreated;
}
/**
* @return Returns the version.
*
* @hibernate.version
*/
public Integer getVersion() {
return version;
}
/**
* @param version
* The version to set.
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* @return Returns the weblogId.
*
* @hibernate.property column="weblog_id"
*/
public Long getWeblogId() {
return weblogId;
}
/**
* @param weblogId
* The weblogId to set.
*/
public void setWeblogId(Long weblogId) {
this.weblogId = weblogId;
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(Object object) {
if (!(object instanceof Entry)) {
return false;
}
Entry rhs = (Entry) object;
return new EqualsBuilder().append(this.text, rhs.text).append(
this.timeCreated, rhs.timeCreated).append(this.weblogId,
rhs.weblogId).append(this.category, rhs.category).append(
this.entryId, rhs.entryId).append(this.categoryId,
rhs.categoryId).append(this.version, rhs.version).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return new HashCodeBuilder(-1879789101, 535224049).append(this.text)
.append(this.timeCreated).append(this.weblogId).append(
this.category).append(this.entryId).append(
this.categoryId).append(this.version).toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("weblogId", this.weblogId).append("text", this.text)
.append("entryId", this.entryId)
.append("version", this.version).append("categoryId",
this.categoryId).append("category", this.category)
.append("timeCreated", this.timeCreated).toString();
}
}
|
[Many-to-Many]
The Weblog system that we are developing allows one additional bit of functionality. A particular Weblog can have many Users. Basically the idea is of a shared weblog that is a place where many users can express themselves about a particular topic of interest. For this bit of functionality the User object will be modified to have a many-to-many relationship with Weblog.
Weblog modifications:
package org.appfuse.model;
import java.util.Date;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @hibernate.class table="weblog"
*/
public class Weblog extends BaseObject {
private Long weblogId;
private String username;
private Date dateCreated;
private String blogTitle;
private Integer version;
private List entries;
private Set users = new HashSet();
/**
* @return Returns the blogTitle.
*
* @hibernate.property column="blog_title"
*/
public String getBlogTitle() {
return blogTitle;
}
/**
* @param blogTitle
* The blogTitle to set.
*/
public void setBlogTitle(String blogTitle) {
this.blogTitle = blogTitle;
}
/**
* @return Returns the dateCreated.
*
* @hibernate.property column="date_created"
*/
public Date getDateCreated() {
return dateCreated;
}
/**
* @param dateCreated
* The dateCreated to set.
*/
public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
/**
* @return Returns the entries.
*
* @hibernate.bag name="entries" lazy="true" inverse="true" cascade="delete"
* @hibernate.collection-key column="entry_id"
* @hibernate.collection-one-to-many class="org.appfuse.model.Entry"
*/
public List getEntries() {
return entries;
}
/**
* @param entries
* The entries to set.
*/
public void setEntries(List entries) {
this.entries = entries;
}
/**
* @return Returns the id.
*
* @hibernate.id column="weblog_id" generator-class="native"
* unsaved-value="null"
*/
public Long getWeblogId() {
return weblogId;
}
/**
* @param id
* The id to set.
*/
public void setWeblogId(Long weblogId) {
this.weblogId = weblogId;
}
/**
* @return Returns the username.
*
* @hibernate.property column="username"
*/
public String getUsername() {
return username;
}
/**
* @param username
* The username to set.
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return Returns the users.
*
* @hibernate.set table="weblog_user" cascade="none" lazy="false"
* @hibernate.collection-key column="weblog_id"
* @hibernate.collection-many-to-many class="org.appfuse.model.User"
* column="username"
*/
public Set getUsers() {
return users;
}
/**
* Adds a user for the weblog
*
* @param rolename
*/
public void addUser(User user) {
getUsers().add(user);
}
/**
* @param users
* The users to set.
*/
public void setUsers(Set users) {
this.users = users;
}
/**
* @return Returns the version.
*
* @hibernate.version
*/
public Integer getVersion() {
return version;
}
/**
* @param version
* The version to set.
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(Object object) {
if (!(object instanceof Weblog)) {
return false;
}
Weblog rhs = (Weblog) object;
return new EqualsBuilder().append(this.users, rhs.users).append(
this.blogTitle, rhs.blogTitle).append(this.weblogId,
rhs.weblogId).append(this.username, rhs.username).append(
this.entries, rhs.entries).append(this.dateCreated,
rhs.dateCreated).append(this.version, rhs.version).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return new HashCodeBuilder(1149273015, 1751732143).append(this.users)
.append(this.blogTitle).append(this.weblogId).append(
this.username).append(this.entries).append(
this.dateCreated).append(this.version).toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("weblogId", this.weblogId).append("version",
this.version).append("users", this.users).append(
"username", this.username).append("blogTitle",
this.blogTitle).append("entries", this.entries).append(
"dateCreated", this.dateCreated).toString();
}
}
|
User modifications
package org.appfuse.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* User class
*
* This class is used to generate Spring Validation rules as well as the
* Hibernate mapping file.
*
* <p>
* <a href="User.java.html"> <i>View Source </i> </a>
* </p>
*
* @author <a href="mailto:[email protected]">Matt Raible </a> Updated by
* Dan Kibler ([email protected])
*
* @hibernate.class table="app_user"
*/
public class User extends BaseObject implements Serializable {
protected String username;
protected String password;
protected String confirmPassword;
protected String firstName;
protected String lastName;
protected Address address = new Address();
protected String phoneNumber;
protected String email;
protected String website;
protected String passwordHint;
protected Integer version;
protected Boolean enabled;
protected Set roles = new HashSet();
protected Set weblogs;
/**
* Returns the username.
*
* @return String
*
* @hibernate.id column="username" length="20" generator-class="assigned"
* unsaved-value="version"
*/
public String getUsername() {
return username;
}
/**
* Returns the password.
*
* @return String
*
* @hibernate.property column="password" not-null="true"
*/
public String getPassword() {
return password;
}
/**
* Returns the confirmedPassword.
*
* @return String
*/
public String getConfirmPassword() {
return confirmPassword;
}
/**
* Returns the firstName.
*
* @return String
*
* @hibernate.property column="first_name" not-null="true" length="50"
*/
public String getFirstName() {
return firstName;
}
/**
* Returns the lastName.
*
* @return String
*
* @hibernate.property column="last_name" not-null="true" length="50"
*/
public String getLastName() {
return lastName;
}
public String getFullName() {
return firstName + ' ' + lastName;
}
/**
* Returns the address.
*
* @return Address
*
* @hibernate.component
*/
public Address getAddress() {
return address;
}
/**
* Returns the email. This is an optional field for specifying a different
* e-mail than the username.
*
* @return String
*
* @hibernate.property name="email" not-null="true" unique="true"
*/
public String getEmail() {
return email;
}
/**
* Returns the phoneNumber.
*
* @return String
*
* @hibernate.property column="phone_number" not-null="false"
*/
public String getPhoneNumber() {
return phoneNumber;
}
/**
* Returns the website.
*
* @return String
*
* @hibernate.property column="website" not-null="false"
*/
public String getWebsite() {
return website;
}
/**
* Returns the passwordHint.
*
* @return String
*
* @hibernate.property column="password_hint" not-null="false"
*/
public String getPasswordHint() {
return passwordHint;
}
/**
* Returns the user's roles.
*
* @return Set
*
* @hibernate.set table="user_role" cascade="save-update" lazy="false"
* @hibernate.collection-key column="username"
* @hibernate.collection-many-to-many class="org.appfuse.model.Role"
* column="role_name"
*/
public Set getRoles() {
return roles;
}
/**
* Adds a role for the user
*
* @param rolename
*/
public void addRole(Role role) {
getRoles().add(role);
}
/**
* Sets the username.
*
* @param username
* The username to set
* @spring.validator type="required"
*/
public void setUsername(String username) {
this.username = username;
}
/**
* Sets the password.
*
* @param password
* The password to set
*
* @spring.validator type="required"
* @spring.validator type="twofields" msgkey="errors.twofields"
* @spring.validator-args arg1resource="user.password"
* @spring.validator-args arg1resource="user.confirmPassword"
* @spring.validator-var name="secondProperty" value="confirmPassword"
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Sets the confirmedPassword.
*
* @param confirmPassword
* The confirmed password to set
* @spring.validator type="required"
*/
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}
/**
* Sets the firstName.
*
* @spring.validator type="required"
* @param firstName
* The firstName to set
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* Sets the lastName.
*
* @param lastName
* The lastName to set
*
* @spring.validator type="required"
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* Sets the address.
*
* @param address
* The address to set
*
* @spring.validator
*/
public void setAddress(Address address) {
this.address = address;
}
/**
* Sets the email.
*
* @param email
* The email to set
*
* @spring.validator type="required"
* @spring.validator type="email"
*/
public void setEmail(String email) {
this.email = email;
}
/**
* Sets the phoneNumber.
*
* @param phoneNumber
* The phoneNumber to set
*
* @spring.validator type="mask" msgkey="errors.phone"
* @spring.validator-var name="mask" value="${phone}"
*/
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
/**
* Sets the website.
*
* @param website
* The website to set
*/
public void setWebsite(String website) {
this.website = website;
}
/**
* @param passwordHint
* The password hint to set
*
* @spring.validator type="required"
*/
public void setPasswordHint(String passwordHint) {
this.passwordHint = passwordHint;
}
/**
* Sets the roles.
*
* @param roles
* The roles to set
*/
public void setRoles(Set roles) {
this.roles = roles;
}
/**
* @return Returns the updated timestamp.
* @hibernate.version
*/
public Integer getVersion() {
return version;
}
/**
* @param updated
* The updated version to set.
*/
public void setVersion(Integer version) {
this.version = version;
}
/**
* @return Returns the weblogs.
*/
public Set getWeblogs() {
return weblogs;
}
/**
* @param weblogs
* The weblogs to set.
*/
public void setWeblogs(Set weblogs) {
this.weblogs = weblogs;
}
/**
* @return Returns the enabled.
* @hibernate.property column="enabled"
*/
public Boolean getEnabled() {
return enabled;
}
/**
* @param enabled
* The enabled to set.
*/
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
/**
* Convert user roles to LabelValue objects for convenience.
*/
public List getRoleList() {
List userRoles = new ArrayList();
if (this.roles != null) {
for (Iterator it = roles.iterator(); it.hasNext();) {
Role role = (Role) it.next();
// convert the user's roles to LabelValue Objects
userRoles.add(new LabelValue(role.getName(), role.getName()));
}
}
return userRoles;
}
/**
* @see java.lang.Object#equals(Object)
*/
public boolean equals(Object object) {
if (!(object instanceof User)) {
return false;
}
User rhs = (User) object;
return new EqualsBuilder().append(this.password, rhs.password).append(
this.passwordHint, rhs.passwordHint).append(this.address,
rhs.address).append(this.roles, rhs.roles).append(
this.firstName, rhs.firstName).append(this.lastName,
rhs.lastName).append(this.version, rhs.version).append(
this.weblogs, rhs.weblogs).append(this.enabled, rhs.enabled)
.append(this.confirmPassword, rhs.confirmPassword).append(
this.username, rhs.username).append(this.email,
rhs.email).append(this.phoneNumber, rhs.phoneNumber)
.append(this.website, rhs.website).isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return new HashCodeBuilder(-1892187061, -1292517047).append(
this.password).append(this.passwordHint).append(this.address)
.append(this.roles).append(this.firstName)
.append(this.lastName).append(this.version)
.append(this.weblogs).append(this.enabled).append(
this.confirmPassword).append(this.username).append(
this.email).append(this.phoneNumber).append(
this.website).toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("roles", this.roles).append("enabled", this.enabled)
.append("firstName", this.firstName).append("lastName",
this.lastName)
.append("passwordHint", this.passwordHint).append("version",
this.version).append("username", this.username).append(
"weblogs", this.weblogs).append("fullName",
this.getFullName()).append("email", this.email).append(
"phoneNumber", this.phoneNumber).append("password",
this.password).append("address", this.address).append(
"confirmPassword", this.confirmPassword).append(
"roleList", this.getRoleList()).append("website",
this.website).toString();
}
}
|
DAO Stuff
WeblogDaoTest
package org.appfuse.dao;
import java.util.Date;
import org.appfuse.Constants;
import org.appfuse.model.Address;
import org.appfuse.model.Weblog;
import org.appfuse.model.User;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
public class WeblogDaoTest extends BaseDaoTestCase {
private WeblogDAO wldao = null;
private Weblog weblog = null;
private UserDAO udao = null;
private User user = null;
protected void setUp() throws Exception {
super.setUp();
wldao = (WeblogDAO) ctx.getBean("weblogDAO");
udao = (UserDAO) ctx.getBean("userDAO");
}
protected void tearDown() throws Exception {
super.tearDown();
wldao = null;
}
public void testGetWeblogInvalid() throws Exception {
try {
weblog = wldao.getWeblog(new Long(3000));
fail("weblogId found in database, failing test...");
} catch (DataAccessException d) {
assertTrue(d != null);
}
}
public void testGetWeblog() throws Exception {
weblog = wldao.getWeblog(new Long(1));
assertNotNull(weblog);
assertEquals(2, weblog.getUsers().size());
}
public void testUpdateWeblog() throws Exception {
weblog = wldao.getWeblog(new Long(2));
weblog.setBlogTitle("Testing Update Weblog");
wldao.saveWeblog(weblog);
assertEquals("Testing Update Weblog", weblog.getBlogTitle());
}
public void testAddWeblogUser() throws Exception {
weblog = wldao.getWeblog(new Long(2));
assertEquals(1, weblog.getUsers().size());
user = udao.getUser("tomcat");
weblog.addUser(user);
wldao.saveWeblog(weblog);
assertEquals(2, weblog.getUsers().size());
//add the same user twice - should result in no additional user
weblog.addUser(user);
wldao.saveWeblog(weblog);
assertEquals("more than 2 of the same users", 2, weblog.getUsers().size());
weblog.getUsers().remove(user);
wldao.saveWeblog(weblog);
assertEquals(1, weblog.getUsers().size());
}
public void testAddAndRemoveWeblog() throws Exception {
weblog = new Weblog();
weblog.setBlogTitle("A new test for adding and then deleting a weblog");
weblog.setDateCreated(new Date(2005-04-17));
weblog.setUsername("Cartman");
wldao.saveWeblog(weblog);
assertNotNull(weblog.getBlogTitle());
assertEquals("Cartman", weblog.getUsername());
wldao.removeWeblog(weblog.getWeblogId());
try {
weblog = wldao.getWeblog(weblog.getWeblogId());
fail("saveWeblog didn't throw DataAccessException");
} catch (DataAccessException d) {
assertNotNull(d);
}
}
}
|
WeblogDAO
package org.appfuse.dao;
import java.util.List;
import org.appfuse.model.Weblog;
public interface WeblogDAO extends Dao{
public Weblog getWeblog(Long weblogId);
public List getWeblogs(Weblog weblog);
public void saveWeblog(Weblog weblog);
public void removeWeblog(Long weblogId);
}
|
WeblogDAOHibernate
package org.appfuse.dao.hibernate;
import java.util.List;
import org.appfuse.dao.WeblogDAO;
import org.appfuse.model.Weblog;
import org.springframework.orm.ObjectRetrievalFailureException;
/**
* This class interacts with Spring's HibernateTemplate to save/delete and
* retrieve Weblog objects.
*
* <p>
* <a href="WeblogDAOHibernate.java.html"><i>View Source</i></a>
* </p>
*
*/
public class WeblogDAOHibernate extends BaseDaoHibernate implements WeblogDAO {
public Weblog getWeblog(Long weblogId) {
Weblog weblog = (Weblog) getHibernateTemplate().get(Weblog.class, weblogId);
if (weblog == null) {
log.warn("uh oh, weblog '" + weblogId + "' not found...");
throw new ObjectRetrievalFailureException(Weblog.class, weblogId);
}
return weblog;
}
/**
* @see org.appfuse.dao.WeblogDAO#getWeblogs(org.appfuse.model.Weblog)
*/
public List getWeblogs(Weblog weblog) {
return getHibernateTemplate().find("from Weblog wl order by upper(wl.blogTitle)");
}
/**
* @see org.appfuse.dao.WeblogDAO#saveWeblog(org.appfuse.model.Weblog)
*/
public void saveWeblog(final Weblog weblog) {
if (log.isDebugEnabled()) {
log.debug("weblog's title: " + weblog.getBlogTitle());
}
getHibernateTemplate().saveOrUpdate(weblog);
// necessary to throw a DataIntegrityViolation and catch it in WeblogManager
getHibernateTemplate().flush();
}
/**
* @see org.appfuse.dao.WeblogDAO#removeWeblog(java.lang.String)
*/
public void removeWeblog(Long weblogId) {
Weblog weblog = getWeblog(weblogId);
getHibernateTemplate().delete(weblog);
}
}
|
Sample Data
Add some sample data to /metadata/sql/sample-data.xml.
<table name='weblog'>
<column>weblog_id</column>
<column>blog_title</column>
<column>date_created</column>
<column>username</column>
<column>version</column>
<row>
<value>1</value>
<value><![CDATA[Sponge Bob is Cool]]></value>
<value>2004-03-31</value>
<value>tomcat</value>
<value>1</value>
</row>
<row>
<value>2</value>
<value><![CDATA[Java Development = Fun]]></value>
<value>2005-01-05</value>
<value>mraible</value>
<value>1</value>
</row>
</table>
<table name='weblog_user'>
<column>weblog_id</column>
<column>username</column>
<row>
<value>1</value>
<value>tomcat</value>
</row>
<row>
<value>1</value>
<value>mraible</value>
</row>
<row>
<value>2</value>
<value>mraible</value>
</row>
</table>
Configure Spring for WeblogDAO
Modifications need to be made in applicationContext-hibernate.xml for the new entity Weblog.
<property name="mappingResources">
<list>
<value>org/appfuse/model/Role.hbm.xml</value>
<value>org/appfuse/model/User.hbm.xml</value>
<value>org/appfuse/model/UserCookie.hbm.xml</value>
<value>org/appfuse/model/Weblog.hbm.xml</value>
<value>org/appfuse/model/Entry.hbm.xml</value>
<value>org/appfuse/model/Category.hbm.xml</value>
</list>
</property>
|
<!-- WeblogDAO: Hibernate implementation -->
<bean id="weblogDAO" class="org.appfuse.dao.hibernate.WeblogDAOHibernate">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
|
Lazy-Loading Issues
Managing relationships and indexed properties in the UI
Attachments:
|