簡體   English   中英

使用RowMapper和JdbcTemplate獲得了NullPointerException

[英]Using RowMapper and JdbcTemplate got NullPointerException

我有兩個實體-用戶和訪問組。 使用JdbcTemplate中的RowMapper從MySQL數據庫獲取用戶實體時,我遇到了NullPointerException。 當不對UserRowMapper中的訪問組使用setter時,我沒有NPE,但訪問組accessGroup中為null。

CREATE TABLE `users` (
      `USER_ID` int(11) NOT NULL AUTO_INCREMENT,
      `USER_EMAIL` varchar(255) DEFAULT NULL,
      `USER_NAME` varchar(255) DEFAULT NULL,
      `USER_PWD` varchar(255) DEFAULT NULL,
      `ACCESSGROUP_GROUP_ID` int(11) DEFAULT NULL,
      PRIMARY KEY (`USER_ID`),
      KEY `FK_users_ACCESSGROUP_GROUP_ID` (`ACCESSGROUP_GROUP_ID`),
      CONSTRAINT `FK_users_ACCESSGROUP_GROUP_ID` FOREIGN KEY (`ACCESSGROUP_GROUP_ID`) REFERENCES `access_group` (`GROUP_ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
CREATE TABLE `access_group` (
      `GROUP_ID` int(11) NOT NULL AUTO_INCREMENT,
      `GROUP_NAME` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`GROUP_ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

實體

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

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "USER_ID")
        private Integer userId;
        @Column(name = "USER_EMAIL")
        private String userEmail;
        @Column(name = "USER_NAME")
        private String userName;
        @Column(name = "USER_PWD")
        private String userPwd;
        @JoinColumn(name = "ACCESSGROUP_GROUP_ID", referencedColumnName = "GROUP_ID")
        @ManyToOne
        private AccessGroup accessGroup;
@Entity
    @Table(name = "access_group")
    public class AccessGroup implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "GROUP_ID")
        private Integer groupId;
        @Basic(optional = false)
        @Column(name = "GROUP_NAME")
        private String groupName;
        @OneToMany(mappedBy = "accessGroup")
        private Set users;

@Repository("userDao")
    public class UserDaoImpl implements IUserDao {

        @Autowired
        private JdbcTemplate jdbcTemplate;

        @Value("${sql.user.get.email.pwd}")
        private String getByEmailAndPwd; 

    //sql.user.get.email.pwd=SELECT * FROM users WHERE user_email = ? AND user_pwd = ?

        @Transactional
        @Override
        public User getUserByEmailAndPwd(String email, String password) {
            return jdbcTemplate.queryForObject(getByEmailAndPwd, new Object[]{email, password}, new UserRowMapper());
        }
@Repository("accessGroupDao")
    public class AccessGroupDaoImpl implements IAccessGroupDao {

        private JdbcTemplate jdbcTemplate;

        @Autowired
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }

        @Value("${sql.accessgroup.get.id}")
        private String getAccessGroupById;
      //sql.accessgroup.get.id=SELECT * FROM access_group WHERE GROUP_ID = ?

        @Transactional
        @Override
        public AccessGroup getGroupById(int id) {
            return jdbcTemplate.queryForObject(getAccessGroupById, new Object[]{id}, new AccessGroupRowMapper());
        }

RowMappers

@Component
    public class UserRowMapper implements RowMapper {

        private AccessGroupService accessGroupService;

        @Autowired
        public void setAccessGroupService(AccessGroupService accessGroupService) {
            this.accessGroupService = accessGroupService;
        }

        @Override
        public User mapRow(ResultSet resultSet, int i) throws SQLException {
            User user = new User();
            user.setId(resultSet.getInt("USER_ID"));
            user.setEmail(resultSet.getString("USER_EMAIL"));
            user.setName(resultSet.getString("USER_NAME"));
            user.setpwd(resultSet.getString("USER_PWD"));
            //when adding here user.setAccessGroup(accessGroupService.getGroupById(resultSet.getInt("ACCESSGROUP_GROUP_ID"))); I have NPE
            return user;
        }
public class AccessGroupRowMapper implements RowMapper {

        @Override
        public AccessGroup mapRow(ResultSet resultSet, int i) throws SQLException {
            AccessGroup accessGroup = new AccessGroup();
            accessGroup.setId(resultSet.getInt("GROUP_ID"));
            accessGroup.setName(resultSet.getString("GROUP_NAME"));
            return accessGroup;
        }
    }

1)將以下屬性添加到您的@Entity類'User'並生成getter和setter方法:

@Transient
private Integer userIdTransientField; 

@Transient表示該屬性不會存儲在數據庫中

2)修改RowMapper類:

將此行替換為以下內容:

user.setId(resultSet.getInt("USER_ID")); -> user.setUserIdTransientField(resultSet.getInt("USER_ID"));

3)當您引用“用戶”對象,並且想要對jdbcTemplate進行更新/刪除,或者只是想獲取ID值時,請使用getUserIdTransientField方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM