请参阅我为用户信息提供的user.java。
@Entity(name = "user")
@Table(name = "user")
public class User {
@Id
@Column(name = "id")
private String id;
@Column(name = "password")
private String password;
//getter and setter for this..
}
这是我的userdao
public class UserDao {
public interface UserDAO {
public String insert(User user);
}
}
这是插入数据库的impl类 看到这是我的代码。请检查一下并告诉我我做错了什么
@Repository
@Transactional
public class UserImpl implements UserDAO {
private DataSource dataSource;
@Autowired
SessionFactory sessionFactory;
@Resource(name = "sessionFactory")
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public String insert(User use) {
Session session = this.sessionFactory.openSession();
try{
Session sess = this.sessionFactory.getCurrentSession();
session.save(reg);
return (String)user.getUserName();
}catch(Exception e){
System.out.println("in catch"+e.getMessage());
e.printStackTrace();
}
}
}
}
并在成功注册后在我的控制器中通过此
将数据插入数据库 userDao.insert(user);
但我没有得到输出意味着没有任何数据插入数据库。为什么这个..?这是我的mvc配置
<context:component-scan base-package="com.user.xyz" />
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/images/, /resources/css/" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
答案 0 :(得分:0)
请记住:您没有任何现有会话,但使用getCurrentSession()
。要使用此方法,您必须已拥有会话。试试这个:
Session session = this.sessionFactory.openSession();
现在你有一个交易会话。
您应该在xml文件(hibernate.xml或spring.xml)中声明sessionFactory,然后使用@Autowire获取它并打开新会话。
答案 1 :(得分:0)
您有两个选择:
一个。强制hibernate刷新你在会话中所做的任何更改:
session.save(user);
session.flush();
B中。使整个方法在事务中运行 - 当然这要好得多。提交事务时 - 只要你手动执行,hibernate就会刷新对数据库的任何更改。
例如:
Transaction tx = null;
try {
session.beginTransaction();
session.save(user);
....
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
throw e;
}
答案 2 :(得分:0)
如果你在一个请求中有多个DAO调用,那么session.getCurrentSession()很有用,但我想这不是你的情况。 如果每个请求只有一个DAO调用,则session.openSession()是正确的方法。
请注意,在使用session.openSession()时,您还必须在之后关闭会话。
最好的办法是为每个传入请求打开一个会话(使用过滤器是最简单的方法),然后在所有DAO中调用sessionFactory.getCurrentSession()以获取当前会话。我想你的问题是你没有指定过滤器。这样,您的所有DAO都可以轻松重复使用,之后您无需关闭会话。
您可以在文档中找到更多信息: Hibernate documentation
答案 3 :(得分:0)
我也面临同样的问题,并得到了解决方案。现在查看以下几点 -
最后如果一切正常,请在插入前使用session.flush()
。
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
{
{
//... your logic
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close()