Java Hibernate测试中引发意外的NullPointerException
项目中创建了ORM模型,并进行了书面测试。一切正常,直到模型没有改变。添加了一对一关系,之后测试将变成返回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
@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()。