The mapping seems to be fine, but I am struggling with the same error.
Have tried @ModelAttribute annotation as well as ModelAndView approach.

POJO: User.java`

```
package com.mediastudio.pojo;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "User")
public class User {

    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    private int userId;

    // @Column(name="username")
    private String username;

    // @Column(name="password")
    private String password;

    @OneToOne(cascade = CascadeType.ALL) 
    //CascadeType.ALL performs actions on parent class when child class is changed automatically
    private Person person;

    public Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }

    @OneToOne(cascade = CascadeType.ALL)
    private UserRole role;

    public UserRole getRole() {
        return role;
    }
    public void setRole(UserRole role) {
        this.role = role;
    }

    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

     public User(){

    } 
}

```

POJO: Person.java

```
package com.mediastudio.pojo;

import java.sql.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.springframework.web.multipart.commons.CommonsMultipartFile;

@Entity
@Table(name = "Person")
public class Person {

    @Id 
    @GeneratedValue
//  @Column(name = "PersonId")
    private int personId;

//  @Column(name = "FirstName")
    private String firstName;

//  @Column(name = "LastName")
    private String lastName;

    @Temporal(TemporalType.DATE)
//  @Column(name = "DateOfBirth")
    private Date dateOfBirth;

//  @Column(name = "Gender")
    private String gender;

//  @Column(name = "Email")
    private String email;

    private CommonsMultipartFile profilePic;
    //  @Column(name = "ProfilePicPath")
    private String profilePicPath;

    public String getProfilePicPath() {
        return profilePicPath;
    }
    public void setProfilePicPath(String profilePicPath) {
        this.profilePicPath = profilePicPath;
    }
    public CommonsMultipartFile getProfilePic() {
        return profilePic;
    }
    public void setProfilePic(CommonsMultipartFile profilePic) {
        this.profilePic = profilePic;
    }
    public int getPersonId() {
        return personId;
    }
    public void setPersonId(int personId) {
        this.personId = personId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public Date getDateOfBirth() {
        return dateOfBirth;
    }
    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

    /*
    //bidirectional one to one mapping
    @OneToOne(cascade = CascadeType.ALL) 
    //CascadeType.ALL performs actions on parent class when child class is changed automatically
    @JoinColumn(name="PersonId")
    private User userAccount;

    public User getUserAccount() {
        return userAccount;
    }
    public void setUserAccount(User userAccount) {
        this.userAccount = userAccount;
    }

    */

    public Person(){

    }

    }

```

View: register.jsp

```
<form:form action="adduser" commandName="userForm" method="post">

<table id="registertable" cellpadding="10">

    <tr>
    <td>First Name</td>
    <td><form:input path="person.firstName" size="30" /> <font color="red"><form:errors path="person.firstName"/></font>
        (max 30 characters a-z and A-Z)
    </td>
    </tr>

    <tr>
    <td>Last Name</td>
    <td><form:input path="person.lastName" size="30" /> <font color="red"><form:errors path="person.lastName"/></font>
        (max 30 characters a-z and A-Z)
    </td>
    </tr>

    <tr>
    <td>Email</td>
    <td><form:input path="person.email" size="30" /> <font color="red"><form:errors path="person.email"/></font></td>
    </tr>

    <tr>
    <td>User Name</td>
    <td><form:input path="username" size="30" /> <font color="red"><form:errors path="username"/></font></td>
    </tr>

    <tr>
    <td>Password</td>
    <td><form:password path="password" size="30" /> <font color="red"><form:errors path="password"/></font></td>
    </tr>
    <tr></tr>
    <tr>
    <td colspan="2" align="center">
        <input type="submit" value="Submit">
        <input type="reset" value="Reset">
    </td>
    </tr>

    </table>
</form:form>

```

LoginController.java

```
@RequestMapping(value = "/adduser", method = RequestMethod.POST)
@Transactional
public String create (Model model, @Valid @ModelAttribute User userForm, HttpServletRequest request) throws mediaException
{
    userForm.setPerson(userForm.getPerson());
    userDao.create(userForm);
    HttpSession session = request.getSession();
    session.setAttribute("user", userForm);
    return "index";
}

@RequestMapping(value = "/adduser",method = RequestMethod.GET)
public String initializeForm(ModelMap model) {

    model.addAttribute("userForm", new User());
    return "adduser";
}

```

UserDAO.java

```
public void create(User user)
            throws mediaException {

            Session session = HibernateUtil.getSessionFactory().openSession();
            try
            {   

            Transaction transaction = session.beginTransaction();

            user.setUsername(user.getUsername());
            user.setPassword(user.getPassword());
            user.getPerson().setEmail(user.getPerson().getEmail());
            user.getPerson().setFirstName(user.getPerson().getFirstName());
            user.getPerson().setLastName(user.getPerson().getLastName());

            session.save(user);
            transaction.commit();

        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally
        {
            session.close();
        }
    }

```

POM.xml

```
    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
            <exclusions>
                <!-- Exclude Commons Logging in favor of SLF4j -->
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                 </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>

        <!-- AspectJ -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj-version}</version>
        </dependency>   

        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.mail</groupId>
                    <artifactId>mail</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
            </exclusions>
            <scope>runtime</scope>
        </dependency>

        <!-- @Inject -->
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>

        <!-- Servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- Hibernate -->

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.0.0.GA</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.2.0.Final</version>
</dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.5.1-Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.5.6-Final</version>
        </dependency>

        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>

        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>        
    </dependencies>

```

root cause:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'userForm' available as request attribute
 org.springframework.web.servlet.support.BindStatus.(BindStatus.java:141)