java - DAO 中的 NullPointerException,sessionFactory
问题描述
帮助,当我在 getTeamFromDB 方法中访问 DAO 时出现 NullPointerException。可能是什么原因?调试器对 GenericDao 类中的 getSession() 方法发誓。
通用道
@Repository
@Transactional
public abstract class GenericDao<T> {
@Autowired
protected SessionFactory sessionFactory;
public abstract T get(T object);
public abstract List<T> getAll();
public boolean isExist(T object) {
return get(object) != null;
}
public void save(T object) {
getSession().save(object);
}
public void update(T object) {
getSession().update(object);
}
public void delete(T object) {
getSession().delete(object);
}
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
}
队道
@Repository
@Transactional
public class TeamDao extends GenericDao<TeamEntity> {
public TeamEntity get(String teamName){
Session session = getSession();
Query query = session.createQuery("from TeamEntity team where team.name=:teamName");
query.setParameter("teamName", teamName);
return (TeamEntity) query.uniqueResult();
}
@Override
public TeamEntity get(TeamEntity team) {
return get(team.getName());
}
@Override
public List<TeamEntity> getAll() {
Session session = getSession();
Criteria criteria = session.createCriteria(TeamEntity.class);
criteria.addOrder(Order.asc("name"));
return criteria.list();
}
public List<TeamEntity> getAllNotOrder() {
Session session = getSession();
Criteria criteria = session.createCriteria(TeamEntity.class);
return criteria.list();
}
}
HltvMatchesStatParser
@Service
public class HltvMatchesStatParser {
private final int START_CHILD = 5;
@Autowired
private MatchDao matchDao;
@Autowired
private TeamDao teamDao;
@Autowired
private StatisticDao statisticDao;
private final static String URL = "https://www.hltv.org/results";
public void parse() {
try {
Document doc = Jsoup.connect(URL)
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://google.com").get();
Elements elements = doc.getElementsByClass("result-con");
List<MatchEntity> matchModelList = new ArrayList<>();
for (Element element : elements) {
Integer scorelost = Integer.valueOf(element
.getElementsByClass("score-lost")
.get(0).text());
Integer scorewon = Integer.valueOf(element
.getElementsByClass("score-won")
.get(0).text());
String teams[] = element.getElementsByClass("team")
.stream().map(Element::text)
.collect(Collectors.toList()).toArray(new String[]{});
MatchEntity model = new MatchEntity();
String team1Name = teams[0];
model.setTeam1(getTeamFromDB(team1Name));
String team2Name = teams[1];
model.setTeam2(getTeamFromDB(team2Name));
model.setScore1(scorelost);
model.setScore2(scorewon);
matchModelList.add(model);
addMatch(model);
}
matchModelList.forEach(System.out::println);
} catch (IOException e) {
System.out.println("Document not found");
}
}
...
private TeamEntity getTeamFromDB(String teamName) {
TeamEntity team = teamDao.get(teamName);
if (team == null) {
team = new TeamEntity();
team.setName(teamName);
team.setMatches(0);
team.setWins(0);
teamDao.save(team);
team = teamDao.get(teamName);
System.out.println("Team add : " + teamName);
}
return team;
}
所有设置都位于此处。
数据源.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/home"/>
<property name="username" value="root"/>
<property name="password" value="Root123456789"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan">
<list>
<value>com.lounge.stat.model</value>
<value>com.lounge.stat.controller</value>
<value>com.lounge.stat.dto</value>
<value>com.lounge.stat.repository</value>
<value>com.lounge.stat.service</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/home</prop>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<!--<prop key="hibernate.hbm2ddl.auto">update</prop> -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
如果需要更多文件,我会添加。谢谢
解决方案
推荐阅读
- python - 在 Web 应用程序中禁用副本服务
- javascript - Android 9.0 无法安装 React Native 应用
- python - 如何编写 python 脚本以使用 http 与远程服务进行交互
- uwp - OpenGL (角度) + XAML (UWP)
- vba - 如何在允许 Word 文档关闭之前要求确认?
- swift - Swift BackTracking N-queen
- python - 使用 Python 从地图图像中提取建筑物边缘
- r - 用 dplyr 总结逻辑数据帧
- rubyxl - RubyXL:如何在 XLSX 中将单元格设为下拉列表
- java - 从相机/图库加载图像位图时旋转 [Android 9]