Java Hibernate测试中引发意外的NullPointerException

Java Hibernate测试中引发意外的NullPointerException,java,spring,hibernate,frameworks,nullpointerexception,Java,Spring,Hibernate,Frameworks,Nullpointerexception,项目中创建了ORM模型,并进行了书面测试。一切正常,直到模型没有改变。添加了一对一关系,之后测试将变成返回NullPointerException 在切割代码中有两个类具有一对一的关系 等级护照: @Entity @Table(name = "PASSPORTS") public class Passport extends BaseObject implements Serializable { private User user; private String firstNam

项目中创建了ORM模型,并进行了书面测试。一切正常,直到模型没有改变。添加了一对一关系,之后测试将变成返回NullPointerException

在切割代码中有两个类具有一对一的关系

等级护照:

@Entity
@Table(name = "PASSPORTS")
public class Passport extends BaseObject implements Serializable {

   private User user;
   private String firstName, lastName;

   // other fields...

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn (name="USER_ID", updatable = false, insertable = false)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Column(name = "FIRST_NAME", length = 60)
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Column(name = "LAST_NAME", length = 80)
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    // other getters-setters...
}
@Entity
@Indexed
@Table(name = "USERS")
public class User extends BaseObject implements Serializable, UserDetails {

private Passport passport;
private Long id;

// other fields...

@Id
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "USERS_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@Column(name = "USER_ID")
public Long getId() {
    return this.id;
}



@OneToOne(fetch = FetchType.EAGER, mappedBy = "user", cascade = CascadeType.ALL)
public Passport getPassport() {
    return this.passport;
}

public void setPassport(Passport passport) {
    this.passport = passport;
}


public void setId(Long id) {
    this.id = id;
} 

@Transient
public String getFirstName() {
    return getPassport().getFirstName();
}

@Transient
public String getLastName() {
    return getPassport().getLastName();
}

@Transient
public String getFullName() {
    return getPassport().getFirstName() + " " + getPassport().getLastName();
}

@Transient
public String getMiddleName() {
    return getPassport().getMiddleName();
}

@Transient
public void setFirstName(String name) {
    getPassport().setFirstName(name);
}

@Transient
public void setLastName(String name) {
    getPassport().setLastName(name);
}

@Transient
public void setMiddleName(String name) {
    getPassport().setMiddleName(name);
}

// other getters-setters...

}
  testUpdateUser(uz.eopc.dao.UserDaoTest): Unexpected exception, expected<org.springframework.orm.hibernate4.HibernateSystemException> but was<java.lang.NullPointerException>
  testAddAndRemoveUser(uz.eopc.dao.UserDaoTest): Unexpected exception, expected<org.springframework.dao.DataAccessException> but was<java.lang.NullPointerException>
  testAddAndRemoveUser(uz.eopc.service.impl.UserManagerImplTest): Unexpected exception, expected<org.apache.commons.beanutils.NestedNullException> but was<java.lang.reflect.InvocationTargetException>
  testAddExistingUser(uz.eopc.service.UserExistsExceptionTest): Unexpected exception, expected<uz.eopc.service.UserExistsException> but was<org.springframework.beans.FatalBeanException>
  testAddAndRemoveUser(uz.eopc.service.UserManagerTest): Unexpected exception, expected<org.apache.commons.beanutils.NestedNullException> but was<java.lang.reflect.InvocationTargetException>
类用户:

@Entity
@Table(name = "PASSPORTS")
public class Passport extends BaseObject implements Serializable {

   private User user;
   private String firstName, lastName;

   // other fields...

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn (name="USER_ID", updatable = false, insertable = false)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Column(name = "FIRST_NAME", length = 60)
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Column(name = "LAST_NAME", length = 80)
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    // other getters-setters...
}
@Entity
@Indexed
@Table(name = "USERS")
public class User extends BaseObject implements Serializable, UserDetails {

private Passport passport;
private Long id;

// other fields...

@Id
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "USERS_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@Column(name = "USER_ID")
public Long getId() {
    return this.id;
}



@OneToOne(fetch = FetchType.EAGER, mappedBy = "user", cascade = CascadeType.ALL)
public Passport getPassport() {
    return this.passport;
}

public void setPassport(Passport passport) {
    this.passport = passport;
}


public void setId(Long id) {
    this.id = id;
} 

@Transient
public String getFirstName() {
    return getPassport().getFirstName();
}

@Transient
public String getLastName() {
    return getPassport().getLastName();
}

@Transient
public String getFullName() {
    return getPassport().getFirstName() + " " + getPassport().getLastName();
}

@Transient
public String getMiddleName() {
    return getPassport().getMiddleName();
}

@Transient
public void setFirstName(String name) {
    getPassport().setFirstName(name);
}

@Transient
public void setLastName(String name) {
    getPassport().setLastName(name);
}

@Transient
public void setMiddleName(String name) {
    getPassport().setMiddleName(name);
}

// other getters-setters...

}
  testUpdateUser(uz.eopc.dao.UserDaoTest): Unexpected exception, expected<org.springframework.orm.hibernate4.HibernateSystemException> but was<java.lang.NullPointerException>
  testAddAndRemoveUser(uz.eopc.dao.UserDaoTest): Unexpected exception, expected<org.springframework.dao.DataAccessException> but was<java.lang.NullPointerException>
  testAddAndRemoveUser(uz.eopc.service.impl.UserManagerImplTest): Unexpected exception, expected<org.apache.commons.beanutils.NestedNullException> but was<java.lang.reflect.InvocationTargetException>
  testAddExistingUser(uz.eopc.service.UserExistsExceptionTest): Unexpected exception, expected<uz.eopc.service.UserExistsException> but was<org.springframework.beans.FatalBeanException>
  testAddAndRemoveUser(uz.eopc.service.UserManagerTest): Unexpected exception, expected<org.apache.commons.beanutils.NestedNullException> but was<java.lang.reflect.InvocationTargetException>
现在测试:

public class UserDaoTest extends BaseDaoTestCase {
@Autowired
private UserDao userDao;
@Autowired
private RoleDao roleDao;


@Test(expected = HibernateSystemException.class)
public void testUpdateUser() throws Exception {
    User user = userDao.get(-1L);

    Address address = user.getAddress();

    userDao.saveUser(user);
    flush();

    user = userDao.get(-1L);
    assertEquals(address, user.getAddress());

    User user2 = new User();
    user2.setAddress(user.getAddress());
    user2.setConfirmPassword(user.getConfirmPassword());
    user2.setEmail(user.getEmail());
    user2.setFirstName(user.getFirstName());
    user2.setLastName(user.getLastName());
    user2.setPassword(user.getPassword());
    user2.setPasswordHint(user.getPasswordHint());
    user2.setRoles(user.getRoles());
    user2.setUsername(user.getUsername());

    userDao.saveUser(user2);
}

@Test(expected = DataAccessException.class)
public void testAddAndRemoveUser() throws Exception {
    User user = new User("testuser");
    user.setPassword("testpass");
    user.setFirstName("Test");
    user.setLastName("Last");
    Address address = new Address();
    user.setAddress(address);
    user.setEmail("testuser@appfuse.org");

    Role role = roleDao.getRoleByName(Constants.USER_ROLE);
    assertNotNull(role.getId());
    user.addRole(role);

    user = userDao.saveUser(user);
    flush();

    assertNotNull(user.getId());
    user = userDao.get(user.getId());
    assertEquals("testpass", user.getPassword());

    userDao.remove(user);
    flush();

    // should throw DataAccessException
    userDao.get(user.getId());
}
}
测试结果:

@Entity
@Table(name = "PASSPORTS")
public class Passport extends BaseObject implements Serializable {

   private User user;
   private String firstName, lastName;

   // other fields...

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn (name="USER_ID", updatable = false, insertable = false)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Column(name = "FIRST_NAME", length = 60)
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Column(name = "LAST_NAME", length = 80)
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    // other getters-setters...
}
@Entity
@Indexed
@Table(name = "USERS")
public class User extends BaseObject implements Serializable, UserDetails {

private Passport passport;
private Long id;

// other fields...

@Id
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "USERS_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@Column(name = "USER_ID")
public Long getId() {
    return this.id;
}



@OneToOne(fetch = FetchType.EAGER, mappedBy = "user", cascade = CascadeType.ALL)
public Passport getPassport() {
    return this.passport;
}

public void setPassport(Passport passport) {
    this.passport = passport;
}


public void setId(Long id) {
    this.id = id;
} 

@Transient
public String getFirstName() {
    return getPassport().getFirstName();
}

@Transient
public String getLastName() {
    return getPassport().getLastName();
}

@Transient
public String getFullName() {
    return getPassport().getFirstName() + " " + getPassport().getLastName();
}

@Transient
public String getMiddleName() {
    return getPassport().getMiddleName();
}

@Transient
public void setFirstName(String name) {
    getPassport().setFirstName(name);
}

@Transient
public void setLastName(String name) {
    getPassport().setLastName(name);
}

@Transient
public void setMiddleName(String name) {
    getPassport().setMiddleName(name);
}

// other getters-setters...

}
  testUpdateUser(uz.eopc.dao.UserDaoTest): Unexpected exception, expected<org.springframework.orm.hibernate4.HibernateSystemException> but was<java.lang.NullPointerException>
  testAddAndRemoveUser(uz.eopc.dao.UserDaoTest): Unexpected exception, expected<org.springframework.dao.DataAccessException> but was<java.lang.NullPointerException>
  testAddAndRemoveUser(uz.eopc.service.impl.UserManagerImplTest): Unexpected exception, expected<org.apache.commons.beanutils.NestedNullException> but was<java.lang.reflect.InvocationTargetException>
  testAddExistingUser(uz.eopc.service.UserExistsExceptionTest): Unexpected exception, expected<uz.eopc.service.UserExistsException> but was<org.springframework.beans.FatalBeanException>
  testAddAndRemoveUser(uz.eopc.service.UserManagerTest): Unexpected exception, expected<org.apache.commons.beanutils.NestedNullException> but was<java.lang.reflect.InvocationTargetException>
testUpdateUser(uz.eopc.dao.UserDaoTest):意外异常,应为,但为
testAddAndRemoveUser(uz.eopc.dao.UserDaoTest):意外异常,应为,但为
testAddAndRemoveUser(uz.eopc.service.impl.UserManagerImplTest):意外异常,应为,但为
testAddExistingUser(uz.eopc.service.UserExistsExceptionTest):意外异常,应为,但为
testAddAndRemoveUser(uz.eopc.service.UserManagerTest):意外异常,应为,但为
一对一的关系似乎不起作用,我也不知道为什么

是的,项目使用Spring框架,但如果我在没有Spring的情况下运行这段代码,代码将毫无例外地正常工作

对不起,问题太长了,我希望任何人都能帮助我

附言

Spring框架版本为4.0.0。发布版


Hibernate版本是4.2.7。最终版

我的猜测可能会改变:

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn (name="USER_ID", updatable = false, insertable = false)
public User getUser() {
    return user;
}

用户联接表应该是可插入和可更新的。否则,您将无法在“联接”列中更新或插入。这可能就是问题所在。
希望能有帮助。

最后我找到了异常的原因。我使用AppFuse应用程序框架,它对建模和测试类提出了特殊要求。必须创建特殊的DAO类才能访问hibernate会话,然后才能从DB获取数据。出现异常,因为我的Passport类无法直接访问会话。

感谢您的回答,@lauksas删除可更新可插入部分会引发其他异常,并显示以下消息:实体映射中的重复列:
Passport列:USER\u ID(应使用insert=“false”update=“false”)
,因此,我增加了这一部分。但同样,我可以在不使用Spring的情况下删除此部分,只需将代码直接写入main()。