在JPA

时间:2016-02-23 19:10:28

标签: java spring hibernate spring-mvc jpa

我有一个应用程序(使用注释的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()));

    } 

0 个答案:

没有答案