| FirstName | LastName | Website | AccessTime |
| Arthur | Dent | 2012-03-30 07:09:00.0 | |
| Peter | Griffin | Yahoo! | 2012-03-30 10:36:00.0 |
FirstName and LastName fields to uniquely identify records in the table and perform searches/updates using Hibernate. There are different ways to define a "composite primary key" and, in this post, I will show you an approach I have used successfully in the past, which involves creating an EmbeddedId.
The @EmbeddedId approach:The code is shown below and is pretty self-explanatory. It consists of a
User class which contains a static nested UserId class. The latter holds the first name and the last name attributes and thus represents the composite ID.
import java.io.Serializable;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.hibernate.annotations.Type;
import org.joda.time.DateTime;
/**
* The User entity which contains an embedded UserId.
*/
@Entity
@Table(name = "Users")
public class User {
@EmbeddedId
private UserId id;
private String website;
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime accessTime;
/**
* Default constructor required by Hibernate.
*/
public User() {
}
/**
* @param id the user id
*/
public User(UserId id) {
this.id = id;
}
/**
* @return the id
*/
public UserId getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(UserId id) {
this.id = id;
}
/**
* @return the website
*/
public String getWebsite() {
return website;
}
/**
* @param website the website to set
*/
public void setWebsite(String website) {
this.website = website;
}
/**
* @return the accessTime
*/
public DateTime getAccessTime() {
return accessTime;
}
/**
* @param accessTime the accessTime to set
*/
public void setAccessTime(DateTime accessTime) {
this.accessTime = accessTime;
}
/**
* This represents a "composite primary key" for the Users table.
* It contains all the columns that form a unique id.
* Must implement equals() and hashcode() and be serializable.
* https://community.jboss.org/wiki/EqualsAndHashCode
*/
@Embeddable
public static class UserId implements Serializable {
private static final long serialVersionUID = 1L;
private String firstName;
private String lastName;
/**
* Default constructor required by Hibernate.
*/
public UserId() {
}
/**
* @param firstName the first name
* @param lastName the last name
*/
public UserId(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
/**
* @return the firstName
*/
public String getFirstName() {
return firstName;
}
/**
* @param firstName the firstName to set
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* @return the lastName
*/
public String getLastName() {
return lastName;
}
/**
* @param lastName the lastName to set
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/** (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
return result;
}
/** (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserId other = (UserId) obj;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true;
}
}
}
Usage:The code snippet below shows how you would search for a user and update its access time:
UserId userId = new UserId("Peter", "Griffin");
// search for a user
User user = entityManager.find(User.class, userId);
if (user == null) {
// the user doesn't exist, so create one
user = new User(userId);
}
user.setAccessTime(new DateTime());
// update the user
entityManager.merge(user);
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.