hibernate 如何使用spring + hib将数据插入数据库?

kxe2p93d  于 2022-12-04  发布在  Spring
关注(0)|答案(4)|浏览(148)

有关用户信息,请参阅“我有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..
}

这是我的用户刀

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>
agyaoht7

agyaoht71#

请记住:您没有任何现有会话,但您使用的是getCurrentSession()。要使用此方法,您必须已经有一个会话。请尝试以下操作:

Session session = this.sessionFactory.openSession();

现在,您有了一个用于事务的会话。
您应该在xml文件(hibernate.xml或spring.xml)中声明sessionFactory,然后使用@Autowire获取它并打开新会话。

ybzsozfc

ybzsozfc2#

您有两个选择:
A.强制休眠刷新您在会话中所做任何更改:

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;
}
zd287kbt

zd287kbt3#

如果在一个请求中有多个DAO调用,那么session.getCurrentSession()是有用的,但我想这不是你的情况。如果每个请求只有一个DAO调用,那么session.openSession()是正确的方法。
请注意,在使用session.openSession()时,您还必须在之后关闭会话。
最好的方法是为每个传入的请求打开一个会话(使用过滤器是最简单的方法),然后在所有DAO中调用sessionFactory.getCurrentSession()来获取当前会话。我猜您的问题是您没有指定过滤器。这样您的所有DAO将很容易重用,并且您不需要在之后关闭会话。
您可以在以下文档中找到更多信息:Hibernate documentation

qhhrdooz

qhhrdooz4#

我也面临过同样的问题,并得到了解决方案。现在检查以下几点-
1.检查您正在使用的相应jar文件
1.请检查META-INF文件夹中的manifest.mf以获取应用程序信息。
1.检查配置文件中的休眠配置,以了解休眠模板配置。
1.最后,如果一切正常,则在插入前使用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()

相关问题