我有一个应用程序(使用注释的Spring 4 MVC + Hibernate 4 + MySQL + Maven集成示例),使用基于注释的配置将Spring与Hibernate集成。
我有这样的实体:
/**
*
*/
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Version;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.google.gson.annotations.Expose;
/**
*/
@Entity
@Table(name = "application")
@NamedQueries(value = { @NamedQuery(name = "Application.getByKey",
query = "from Application as a where a.key = :key"),
@NamedQuery(name = "Application.findByUsername",
query = "select a from Application as a left join a.users as u where u.username = :username"),
@NamedQuery(name = "Application.findByCompanyKey",
query = "select a from Application as a where a.company.key = :companyKey") })
public class Application implements Serializable {
/* */
private static final long serialVersionUID = -2694152171872599511L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Expose
private Long id;
@Column(name = "`key`",
unique = true,
nullable = false)
@Expose
private String key;
@Column(name = "description")
@Expose
private String description;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "type_id",
nullable = true)
@Expose
private DeviceType deviceType;
@ManyToOne
@JoinColumn(name = "company_id",
nullable = false)
private Company company;
@ManyToMany(fetch = FetchType.LAZY,
mappedBy = "applications")
private List<User> users;
@OneToMany(fetch = FetchType.LAZY,
mappedBy = "application")
private List<ApplicationAlarm> alarms;
@Version
@Column(name = "version")
private Long version = new Long(0);
/**
* Gets the id.
*
* @return the id
*/
public Long getId() {
return id;
}
/**
* Sets the id.
*
* @param p_id
* the new id
*/
public void setId(final Long p_id) {
id = p_id;
}
/**
* Gets the key.
*
* @return the key
*/
public String getKey() {
return key;
}
/**
* Sets the key.
*
* @param p_key
* the new key
*/
public void setKey(final String p_key) {
key = p_key;
}
/**
* Gets the description.
*
* @return the description
*/
public String getDescription() {
return description;
}
/**
* Sets the description.
*
* @param p_description
* the new description
*/
public void setDescription(final String p_description) {
description = p_description;
}
/**
* Gets the device type.
*
* @return the device type
*/
public DeviceType getDeviceType() {
return deviceType;
}
/**
* Sets the device type.
*
* @param p_deviceType
* the new device type
*/
public void setDeviceType(final DeviceType p_deviceType) {
deviceType = p_deviceType;
}
/**
* Gets the company.
*
* @return the company
*/
public Company getCompany() {
return company;
}
/**
* Sets the company.
*
* @param p_company
* the new company
*/
public void setCompany(final Company p_company) {
company = p_company;
}
/**
* Gets the users.
*
* @return the users
*/
public List<User> getUsers() {
return users;
}
/**
* Sets the users.
*
* @param p_users
* the new users
*/
public void setUsers(final List<User> p_users) {
users = p_users;
}
/**
* Gets the alarms.
*
* @return the alarms
*/
public List<ApplicationAlarm> getAlarms() {
return alarms;
}
/**
* Sets the alarms.
*
* @param p_alarms
* the new alarms
*/
public void setAlarms(final List<ApplicationAlarm> p_alarms) {
alarms = p_alarms;
}
/**
* Gets the version.
*
* @return the version
*/
public Long getVersion() {
return version;
}
/**
* Sets the version.
*
* @param p_version
* the new version
*/
public void setVersion(final Long p_version) {
version = p_version;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object p_obj) {
boolean isEquals = false;
try {
final Application application = (Application) p_obj;
final EqualsBuilder eb = new EqualsBuilder();
eb.append(getKey(), application.getKey());
isEquals = eb.isEquals();
} catch (final Exception e) {
isEquals = false;
}
return isEquals;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final HashCodeBuilder hcb = new HashCodeBuilder();
hcb.append(getKey());
return hcb.toHashCode();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
ToStringBuilder tsb = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE);
tsb.append("id", getId());
tsb.append("version", getVersion());
return tsb.toString();
}
}
和
/**
* @version 1.0
*/
@Entity
@Table(name = "user",
uniqueConstraints = { @UniqueConstraint(columnNames = "username") })
@NamedQueries(value = { @NamedQuery(name = "User.findByUsername",
query = "from User u where u.username = :username") })
@NamedEntityGraph(name = "graph.User.company",
attributeNodes = @NamedAttributeNode("company") )
public class User implements Serializable {
/* */
private static final long serialVersionUID = 3660379416292251393L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username",
nullable = false,
unique = true,
length = 50)
private String username;
@Column(name = "password",
nullable = false,
length = 50)
private String password;
@Column(name = "enabled",
nullable = false)
private boolean enabled = true;
@ManyToMany(fetch = FetchType.EAGER,
cascade = CascadeType.ALL)
@JoinTable(name = "user_authority",
joinColumns = { @JoinColumn(name = "user_id",
nullable = false,
updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "authority_id",
nullable = false,
updatable = false) })
private List<Authority> authorities;
@ManyToOne
@JoinColumn(name = "company_id",
nullable = false)
private Company company;
@ManyToMany(fetch = FetchType.LAZY,
cascade = CascadeType.ALL)
@JoinTable(name = "user_application",
joinColumns = { @JoinColumn(name = "user_id",
nullable = false,
updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "application_id",
nullable = false,
updatable = false) })
private List<Application> applications;
@Version
@Column(name = "version")
private Long version = new Long(0);
/**
* Gets the id.
*
* @return the id
*/
public Long getId() {
return id;
}
/**
* Sets the id.
*
* @param p_id
* the new id
*/
public void setId(final Long p_id) {
id = p_id;
}
/**
* Gets the user name.
*
* @return the user name
*/
public String getUsername() {
return username;
}
/**
* Sets the user name.
*
* @param p_username
* the new user name
*/
public void setUsername(final String p_username) {
username = p_username;
}
/**
* Gets the password.
*
* @return the password
*/
public String getPassword() {
return password;
}
/**
* Sets the password.
*
* @param p_password
* the new password
*/
public void setPassword(final String p_password) {
password = p_password;
}
/**
* Checks if is enabled.
*
* @return true, if is enabled
*/
public boolean isEnabled() {
return enabled;
}
/**
* Sets the enabled.
*
* @param p_enabled
* the new enabled
*/
public void setEnabled(final boolean p_enabled) {
enabled = p_enabled;
}
/**
* Gets the authorities.
*
* @return the authorities
*/
public List<Authority> getAuthorities() {
return authorities;
}
/**
* Sets the authorities.
*
* @param p_authorities
* the new authorities
*/
public void setAuthorities(final List<Authority> p_authorities) {
authorities = p_authorities;
}
/**
* Gets the company.
*
* @return the company
*/
public Company getCompany() {
return company;
}
/**
* Sets the company.
*
* @param p_company
* the new company
*/
public void setCompany(final Company p_company) {
company = p_company;
}
/**
* Gets the applications.
*
* @return the applications
*/
public List<Application> getApplications() {
return applications;
}
/**
* Sets the applications.
*
* @param p_applications
* the new applications
*/
public void setApplications(final List<Application> p_applications) {
applications = p_applications;
}
/**
* Gets the version.
*
* @return the version
*/
public Long getVersion() {
return version;
}
/**
* Sets the version.
*
* @param p_version
* the new version
*/
public void setVersion(final Long p_version) {
version = p_version;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object p_obj) {
boolean isEquals = false;
try {
final User user = (User) p_obj;
final EqualsBuilder eb = new EqualsBuilder();
eb.append(getUsername(), user.getUsername());
isEquals = eb.isEquals();
} catch (final Exception e) {
isEquals = false;
}
return isEquals;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final HashCodeBuilder hcb = new HashCodeBuilder();
hcb.append(getUsername());
return hcb.toHashCode();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
final ToStringBuilder tsb = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE);
tsb.append("id", getId());
tsb.append("username", getUsername());
tsb.append("password", getPassword());
tsb.append("enabled", isEnabled());
tsb.append("authorities", getAuthorities());
// tsb.append("company", getCompany());
tsb.append("version", getVersion());
return tsb.toString();
}
}
我有这个测试,但它在最后一次断言中失败:用户找不到已保存的应用程序!
@Test
public void testSave() throws Exception {
User user = userAccessorService.getByUsernameWithCompany(TEST_USER);
List<Application> applications = getApplicationAccessorService().findUserApplications(user.getUsername());
int applicationsBeforeSave = applications.size();
Application application = new Application();
assertNull ("new application with users !", application.getUsers());
application.setUsers(new ArrayList<User>());
application.getUsers().add(user);
application.setKey(APP_KEY);
application.setCompany(user.getCompany());
user.getApplications().add(application);
getApplicationMutatorService().save(application);
assertNotNull("saved application not found by key ! " , getApplicationAccessorService().findByKey(APP_KEY));
assertEquals ("saved application not found by user !", applicationsBeforeSave+1, applicationAccessorService.findUserApplications(user.getUsername()));
}