Hibernate中的session的save方法。

我正在学习hibernate框架,然后在做一个插入的时候遇到了一个问题。通过跟踪我发现在执行session.save(obj);方法时,程序就不动了。并且在获取session时还打印出下面红色的信息。
请问一个是什么原因以及怎么解决呢?
图片说明

 public int insertClient(Client client) {
        // TODO Auto-generated method stub
        //HibernateUtil.closeSession();
        System.out.println("client insert1 :");
        Session session = HibernateUtil.currentSession();
        //System.out.println(session);
        System.out.println("client insert2 :");
        Transaction transaction = session.beginTransaction();
        System.out.println("client insert3 :");
        System.out.println(client);
        Integer s= (Integer) session.save(client);
        System.out.println("client insert4 :"+s);
        try {
            transaction.commit();
        } catch (Exception e) {
            transaction.rollback();
        } finally {
            HibernateUtil.closeSession();
        }
        System.out.println("row :"+s);
        return s;
    }
 public class HibernateUtil
{
    public static final SessionFactory sessionFactory;

    static
    {
        try
        {
            // 使用默认的hibernate.cfg.xml配置文件创建Configuration实例
            Configuration cfg = new Configuration()
                .configure();
            // 以Configuration实例来创建SessionFactory实例
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties()).build();
            sessionFactory = cfg.buildSessionFactory(serviceRegistry);
        }
        catch (Throwable ex)
        {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    // ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步
    public static final ThreadLocal<Session> session
        = new ThreadLocal<Session>();

    public static Session currentSession()
        throws HibernateException
    {
        Session s = session.get();
        System.out.println("session get:");
        // 如果该线程还没有Session,则创建一个新的Session
        if (s == null)
        {
            s = sessionFactory.openSession();
            // 将获得的Session变量存储在ThreadLocal变量session里
            session.set(s);
        }
        return s;
    }

    public static void closeSession()
        throws HibernateException
    {
        Session s = session.get();
        if (s != null)
            s.close();
        session.set(null);
    }
}

5个回答

Session的save()方法使一个临时对象转变为持久化对象。例如以下代码保存一个Customer对象:
       Customer customer = new Customer();
       customer.setId(new Long(9)); // 为Customer临时对象设置OID是无效的
       customer.setName("Tom");......
答案就在这里:Hibernate Session的save()方法
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

client1已经打印,然后就不动了,是不是数据库断开了

qq_24219459
ChaosKong 不是,是因为数据库表里有两个只差一个字母的列,导致pojo与表对应不上,所以才会那样。但是为什么是在那一步停止而不是说我映射失败,这个我还没弄清楚
接近 4 年之前 回复

session.get ( )方法是什么,你自己定义的吗,我知道有个Session.get(Integer id )静态方法需要传入对象的id

qq_24219459
ChaosKong ThreadLocal<Session> session;这里产生的session.是从线程池里拿一个session。
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
hibernate的session.save()为什么没有执行
User 是一个有id username passwrod的类 hb.cfg.xml <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 先配置数据库链接信息 --> <property name = "connection.driver_class">com.mysql.jdbc.Driver</property> <property name = "connection.url">jdbc:mysql://localhost:3306/dxlin</property> <property name = "connection.username">root</property> <property name = "connection.password">duanlin113</property> <property name="javax.persistence.validation.mode">none</property> <!-- 数据库方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <mapping resource = "com/dxlin/pojo/person.hbm.xml"/> </session-factory> </hibernate-configuration> User.hbm.xml <?xml version="1.0" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package = "com.dxlin.pojo"> <class name = "com.dxlin.pojo.User" table = "User"> <id name = "id"> <!-- 主键生成策略 --> <generator class="native" column = "id"></generator> </id> <property name="username" column = "username"/> <property name="password" column = "password"/> </class> </hibernate-mapping> Test 类 package com.dxlin.hibtest; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import com.dxlin.pojo.User; public class Test { public static void main(String args[]) { System.out.println("1"); //1.新建立Configuration对象 Configuration cfg = new Configuration(); cfg.configure("hb.cfg.xml"); System.out.println("2"); //2.通过Configuration新建sessionFactory对象 ServiceRegistry registry = new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()) .build(); SessionFactory sf = cfg.buildSessionFactory(registry); System.out.println("3"); //3.通过sessionFactory得到session Session session = sf.openSession(); System.out.println("4"); //4.通过session对象得到Transaction对象 Transaction tx = session.beginTransaction(); System.out.println("5"); //保存数据 User user = new User(); user.setUsername("DL2"); user.setPassword("002"); session.save(user); System.out.println("6"); //提交事务 tx.commit(); System.out.println("7"); //关闭session session.close(); System.out.println("8"); } } 代码不报错,运行为 ![图片说明](https://img-ask.csdn.net/upload/201710/15/1508064451_919348.png)
hibernate 采用session.save(Object)方法保存不了数据
代码如下: bean类: package org.hibernate.sample.modle; import java.io.Serializable; import org.apache.commons.lang.builder.ToStringBuilder; /** @author Hibernate CodeGenerator */ public class Student implements Serializable { private static final long serialVersionUID = 1L; /** identifier field */ private Integer studentId; /** persistent field */ private String name; /** persistent field */ private String sex; /** persistent field */ private Integer age; /** full constructor */ public Student(String name, String sex, Integer age) { this.name = name; this.sex = sex; this.age = age; } /** default constructor */ public Student() { } public Integer getStudentId() { return this.studentId; } public void setStudentId(Integer studentId) { this.studentId = studentId; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getSex() { return this.sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return this.age; } public void setAge(Integer age) { this.age = age; } public String toString() { return new ToStringBuilder(this) .append("studentId", getStudentId()) .toString(); } } 映射配置: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="org.hibernate.sample.modle"> <!-- Created by the Middlegen Hibernate plugin 2.1 http://boss.bekk.no/boss/middlegen/ http://www.hibernate.org/ --> <class name="Student" table="student" dynamic-update="true"> <id name="studentId" type="java.lang.Integer" column="student_id" unsaved-value="0"> <generator class="native"/> </id> <property name="name" type="java.lang.String" column="name" not-null="true" length="45"/> <property name="sex" type="java.lang.String" column="sex" not-null="true" length="45"/> <property name="age" type="java.lang.Integer" column="age" not-null="true" length="45"/> <!-- Associations --> </class> </hibernate-mapping> 配置文件: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- SessionFactory 配置 --> <session-factory> <!-- MySQL配置 --> <!-- 数据库URL --> <property name="connection.url"> <![CDATA[ jdbc:mysql://localhost:3306/bms?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8]]> </property> <!-- 数据库JDBC驱动 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!--数据库用户名 --> <property name="connection.username"><![CDATA[root]]></property> <!--数据库用户密码 --> <property name="connection.password"></property> <!--dialect ,每个数据库都有其对应的Dialet以匹配其平台特性 --> <property name="dialect"> org.hibernate.dialect.MySQLDialect</property> <!-- 是否将运行期生成的SQL输出到日志以供调试 --> <property name="show_sql">true</property> <!--映射文件配置,注意配置文件名必须包含其相对于根的全路径 --> <mapping resource="org/hibernate/sample/modle/Student.hbm.xml"/> </session-factory> </hibernate-configuration> 测试类: package test; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.Session; import org.hibernate.sample.modle.Student; import junit.framework.Assert; import junit.framework.TestCase; public class HibernateTest extends TestCase { Session session = null; /** * JUnit中setUp方法在TestCase初始化的时候会自动调用 一般用于初始化公用资源 此例中,用于初始化Hibernate Session */ protected void setUp() { try { /** * 采用hibernate.properties配置文件的初始化代码: Configuration config = new * Configuration(); config.addClass(TUser.class); */ // 采用hibernate.cfg.xml配置文件 // 请注意初始化Configuration时的差异: // 1.Configuration的初始化方式 // 2.xml文件中已经定义了Mapping文件,因此无需再Hard Coding导入 // POJO文件的定义 Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); session = sessionFactory.openSession(); } catch (HibernateException e) { e.printStackTrace(); } } /** * 与setUp方法相对应,JUnit TestCase执行完毕时,会自动调用tearDown方法 一般用于资源释放 * 此例中,用于关闭在setUp方法中打开的Hibernate Session */ protected void tearDown() { try { session.close(); } catch (HibernateException e) { e.printStackTrace(); } } /** * 对象持久化(Insert)测试方法 * * JUnit中,以”test”作为前缀的方法为测试方法,将被JUnit自动添加 到测试计划中运行 */ public void testInsert() { try { Student student = new Student(); // student.setStudentId( Integer.valueOf(1)); student.setName("哈哈"); student.setSex("男"); student.setAge(Integer.valueOf(13)); session.save(student); session.flush(); System.out.println(student.getStudentId()); } catch (HibernateException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } /** * 对象读取(Select)测试 请保证运行之前数据库中已经存在name=’Erica’的记录 */ public void testSelect() { String hql = " from Student where name='哈哈'"; try { Query query= session.createQuery(hql); List list=query.list(); Student student = (Student) list.get(0); Assert.assertEquals(student.getName(), "哈哈"); } catch (HibernateException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } } [b]问题补充:[/b] 数据库表的 create table student( student_id integer unsigned auto_increment, name varchar(45) not null, sex varchar(45) not null, age integer not null );
hibernate 的save保存
hibernate session的save保存一条数据提交一次事务快 还是先全部保存到session中,提交一次事务快 Session session = null; Transaction transaction = null; try { session = sessionFactory.openSession(); transaction = session.beginTransaction(); for(Residents s:allResidents){ session.save(s); } transaction.commit(); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } throw e; } finally { if (session != null) { session.close(); } }
关于hibernate的session.saveOrUpdate()底层实现的问题
这个问题会有点模糊,因为我的目的是想知道 session的增删改查底层实现原理,所以我详细看了下(以saveOrUpdate()方法为主)saveOrUpdate的流程,它的底层相当的庞大,我很认真的看源码,但是其中有很大一部分我都看不懂,我想知道从session.saveOrUpdate(Object javaBean)此方法开始到结束,那个作者是怎么想出来的,那么多的成员变量和局部变量,都是用在哪里的,要怎么看hibernate的源码? Session.saveOrUpdate()目的是为了 新增或者更新 ---执行sql语句 insert或者update 但是insert 或update是自动生成所以要有org.hibernate.sql包来生成sql,还有事物的设置, 但是我能想到的做一个hibernate的需求就这么多了,可是源码中的变量和类多的都不敢想象,我在想它们都用在那个流程,起到什么作用,真是没有办法啦、啊啊啊啊啊啊 最好-->能够给我提供一些好的书本或者文章(专门针对hibernate底层框架<其他的框架spring、struts2也要>的书或者文章),我在网上完全搜不到hibernate的底层的知识,根本就没有半个人写过关于hibernate底层的东西,我渴望了解它的底层,希望有IT界的朋友帮帮忙,我会感激不尽,真的、谢谢
Hibernate无法获取session异常
java.lang.ClassNotFoundException: org.hibernate.Session at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) at com.ecjtuit.hibernate.Persistence.Save(Persistence.java:9) at com.ecjtuit.AddShoes.AddShoes.doPost(AddShoes.java:129) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:619) 出现这个异常,然后只是在servlet中无法获取到session,但是在其他的普通类中是可以获取session的,求各位大神给个解决的办法,我已经快要被这个问题折磨死了。
hibernate4为什么在执行save ()后直接查询直接查询不到数据?
![图片说明](https://img-ask.csdn.net/upload/201511/18/1447830636_399666.png)hibernate4为什么在执行save ()后直接查询直接查询不到数据 同样的配置在hibernate3这样是能查询到数据的,换到hibernate4就是查不到, 就像save()操作没有把对象缓存一样,这样是为什么呀?下面是配置 <property name="dialect"> org.hibernate.dialect.MySQL5InnoDBDialect </property> <property name="current_session_context_class">jta</property> <property name="hibernate.transaction.factory_class"> org.hibernate.transaction.JTATransactionFactory </property> <property name="hibernate.transaction.manager_lookup_class"> com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup </property> <property name="connection.release_mode">auto</property> <property name="hibernate.transaction.flush_before_completion"> true </property> <property name="hibernate.transaction.auto_close_session"> true </property> 事务用的JTA java代码时在同一个事务里添加和查询的: User user = new User() user.setOid("123"); ... Dao.save(user); list lst = Dao.query("User","where oid='123'"); 结果lst为空 理论上save后对象应该缓存在Session里的吧,查询的话也应该查询到缓存里对象吧,可是为什么查询不到呢? 经过验证,对象确实在session里,但是在同一个事务内就是查询不到,为什么呢?
关于hibernate获取session缓存中内容的问题
我现在想实现一个功能就是我将一个对象用hibernateTemplate.save()的方法进行操作,然后我想获得该对象在数据库中的ID,于是我这么写: public int add(FeatureRelationship featureRelationship) { hibernateTemplate.save(featureRelationship); return featureRelationship.getID(); } 但是貌似不能获取,hibernate不是在save的时候是将需要执行的sql语句存入缓存么?那么我能不能在session关闭之前将缓存中的id取出来么?请大大们指教!!
Hibernate 中getSession().save() 保存不到数据库
为什么我的Hibernate 中getSession().save() 保存不到数据库 我的dao中怎么写的: [code="java"] /** * 保存实体 */ public void save(T o) { getSession().persist(o); } [/code] 我在测试单元这样写的: [code="java"] @Test public void testSave() { ApplicationContext cxt = new ClassPathXmlApplicationContext("/applicationContext.xml"); buyerService = (BuyerService)cxt.getBean("buyerService"); Buyer buyer = new Buyer("dengmingti","123456","test@sina.com"); ContactInfo contactInfo = new ContactInfo(); contactInfo.setAddress("百色市朝阳区左家庄"); contactInfo.setMobile("13671323507"); contactInfo.setPhone("010-64469090-9"); contactInfo.setPostalcode("531500"); buyer.setContactinfo(contactInfo); buyer.setGender("男"); buyer.setRealname("刘德华"); buyer.setRegTime(new Date()); buyerService.save(buyer); }[/code] 在dao中写 Transaction tran=getSession().beginTransaction(); tran.commit();也没有用 如果我的测试单元这样写怎可以保存到数据库中: [code="java"] protected static ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml"); protected static SessionFactory sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory"); @Test public void testSave() { Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Buyer buyer = new Buyer("dengmingrun","123456","test@sina.com"); ContactInfo contactInfo = new ContactInfo(); contactInfo.setAddress("北海市朝阳区左家庄"); contactInfo.setMobile("13671323507"); contactInfo.setPhone("010-64469090-9"); contactInfo.setPostalcode("533000"); buyer.setContactinfo(contactInfo); buyer.setGender("男"); buyer.setRealname("张学友"); buyer.setRegTime(new Date()); session.save(buyer); tx.commit(); session.close(); }[/code] 我怎样才能使用buyerService.save(buyer);存到数据库中呀?
hibernate应该何时调用transaction的commit方法将数据与数据库同步
hibernate中,调用session的save、delete、update方法后只是缓存到session里,应该什么时候使用transection的commit方法与数据库数据同步?如果每次调用sava、delete等方法提交一次,好像违背了hibernate的初衷,性能不好。但在网站开发时,添加一个用户信息、更新、或删除时,这些操作是要及时与数据库同步的。我的问题就是应在什么时候把数据提交到数据库。
Hibernate4 No Session found for current thread异常
标题:Hibernate4 No Session found for current thread与createQuery is not valid without active transaction异常 描述: 在项目程序运行时遇到了Hibernate4 No Session found for current thread异常, ![图片说明](https://img-ask.csdn.net/upload/201610/07/1475829970_705784.png) 百度了一下 在hibernate的配置文件中加入了<property name="current_session_context_class">thread</property> 配置并且处理业务逻辑的类上也加入了注解如下 package com.xiaonei.baseService; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.transaction.annotation.Transactional; @Transactional public class BaseServiceImpl implements BaseService { @Resource private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } /** * @author sunlong * @param hql:传入的hql,可以带参数? * @param args: 问号对应的参数数组 */ @Override public List<?> getResult(String hql, Object[] args) { Session session = sessionFactory.getCurrentSession(); System.out.println("执行到创建Session"); Query query = session.createQuery(hql); System.out.println("执行到Query"); if(args!= null && args.length > 0){ for(int i = 0;i<args.length;i++){ query.setParameter(i, args[i]); } } return query.list(); } 但是当我再次运行程序时,出现了createQuery is not valid without active transaction异常 ![图片说明](https://img-ask.csdn.net/upload/201610/07/1475830288_371841.png) 然后我就接着百度,解决方法是把hibernate配置文件中的<property name="current_session_context_class">thread</property> 配置删除或者把值thread改成org.springframework.orm.hibernate3.SpringSessionContext 再次运行却又出现了org.springframework.orm.hibernate3.SpringSessionContext异常整了好久都没搞明白,这是为什么呀? Spring 的配置文件 1.applicationContext.xml <!-- 导入资源文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置 C3P0 数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean> <!-- 配置 SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <property name="mappingLocations" value="classpath:com/xiaonei/domain/*.hbm.xml"></property> </bean> <!-- 配置 Spring 的声明式事务 --> <!-- 1. 配置 hibernate 的事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 2. 配置事务属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="lastNameIsValid" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- 3. 配置事务切入点, 再把事务属性和事务切入点关联起来 --> <aop:config> <aop:pointcut expression="execution(* com.xiaonei.service.*.*(..))" id="txPointcut"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config> <!-- 自动装配具有注解的属性 --> <context:component-scan base-package="com.xiaonei.service"></context:component-scan> </beans> 2.applicationContextbeans.xml <import resource="applicationContext.xml"/> <bean id="countryService" class="com.xiaonei.service.serviceImpl.CountryServiceImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="provinceService" class="com.xiaonei.service.serviceImpl.ProvinceServiceImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="universityService" class="com.xiaonei.service.serviceImpl.UniversityServiceImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="registerAction" class="com.xiaonei.action.RegisterAction"> <property name="countryService" ref="countryService"></property> <property name="provinceService" ref="provinceService"></property> <property name="universityService" ref="universityService"></property> </bean> baseServiceImpl.java package com.xiaonei.service.baseService; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public abstract class BaseServiceImpl implements BaseService { @Resource private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } /** * @author sunlong * @param hql:传入的hql,可以带参数? * @param args: 问号对应的参数数组 */ @Transactional public List<?> getResult(String hql, Object[] args) { System.out.println("执行了getResult方法"); Query query = sessionFactory.getCurrentSession().createQuery(hql); System.out.println("执行到createQuery方法"); if(args!= null && args.length > 0){ for(int i = 0;i<args.length;i++){ query.setParameter(i, args[i]); } } return query.list(); } @Override public void save(Object obj) { // TODO Auto-generated method stub } @Override public void delete(Object obj) { // TODO Auto-generated method stub } @Override public void update(Object obj) { // TODO Auto-generated method stub } @Override public Object findById(Class<?> calzz, Integer id) { // TODO Auto-generated method stub return null; } }
请教Spring对于Hibernate的Session管理
问题: <br />假设我有一个daoA 对象, daoB对象,两个DAO类都是继承自HibernateDaoSupport类,两个对象在ServiceC类里被放在同一个事物里执行DAO中有的方法。比如说daoA.save(),daoB.delete()。 <br />在以上的情况下是不是Spring会提供两个sesssion来分别执行save和delete。 <br />如果我从dao取出的对象被传播到JSP上,并且这个对象配置了有lazy load,是不是会引起异常,为什么。 <br /> <br />另外,假设我配置了openSessionInViewFilter,从数据库中取出的对象可以在JSP上做LAZY LOAD,那这种方式和我在 Service中直接做initialize的优缺点分别是什么? <br /> <br />================================================= <br /> <br />我自己回答一下。 <br />刚刚看了Spring的源代码,它的strategy是这样的,当你调用HibernateTempalte.save()的时候,spring会检查你的config,看是否允许强制enforceNewSession,或者enforceNativeSession,通过这两个不同的策略。spring决定是否是强制创建和当前thread绑定的一个hibernate session,或者只在当前环境下查找一个已经有的session。 <br />如果选择了enForceNewSession,那就意味着HibernateTemplate的每一个操作都会是立刻打开session,但是注意,我没看到关闭session。也就是说,上面的问题会有2个session出现。
hibernate中的事务问题
package cn.itcast.hibernatetest; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import cn.itcast.entity.User; public class HibernateDemo { @Test public void testAdd() { //第一步 加载hibernate核心配置文件 //到src下面照到一个名词是hibernate.cfg.xml //在hibernate里面封装了一个对象 Configuration cfg=new Configuration(); cfg.configure(); //第二步,创建一个SessionFactory对象 //读取hibernate核心配置文件,创建sessionFactory //在过程中,根据映射关系,在配置数据库里面把表创建 SessionFactory sessionFactory = cfg.buildSessionFactory(); //第三步 使用SessionFactory创建session对象 //类似于连接 Session session = sessionFactory.openSession(); //第四步 开启事务 Transaction tx = session.beginTransaction(); //第五步 写具体逻辑crud操作 User user = new User(); user.setUsername("小王"); user.setPassword("250"); user.setAdress("日本"); //调用session的方法实现添加 session.save(user); //第六步 提交事务 tx.commit(); //第七步 关闭资源 session.close(); sessionFactory.close(); } } 代码tx.commit();报错,输入tx.的时候也没有提示commit()方法,为什么,错误提示好像是Transaction中没有commit方法? 错误提示如下: The type javax.persistence.EntityTransaction cannot be resolved. It is indirectly referenced from required .class files 有没有大神解答下,谢谢了
hibernate的saveOrUpdate监听器加入后save方法就包空指针
public int save(User user) { user.setCreateDate(new Date()); Session session=this.getSession(); Transaction tran=session.beginTransaction(); int count=(Integer)session.save(user); tran.commit(); } 这段保存代码是可以执行的。 但是加入监听器之后session.save就会抛出空指针。 监听器代码如下: <!-- 配置hibernate session工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.hbm2ddl.auto">none</prop> <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">false</prop> </props> </property> <property name="mappingDirectoryLocations"> <list> <value>classpath:com/haier/hibernate/hbm</value> </list> </property> <!-- 监听器 --> <property name="eventListeners"> <map> <entry key="save"> <ref bean="saveOrUpdate" /> </entry> </map> </property> </bean> <bean id="saveOrUpdate" class="com.haier.hibernate.listener.SaveOrUpdateListener" /> package com.haier.hibernate.listener; import org.hibernate.HibernateException; import org.hibernate.event.SaveOrUpdateEvent; import org.hibernate.event.SaveOrUpdateEventListener; public class SaveOrUpdateListener implements SaveOrUpdateEventListener { private static final long serialVersionUID = 6050785018061727792L; public void onSaveOrUpdate(SaveOrUpdateEvent arg0) throws HibernateException { System.out.println("saveOrUpdate"); } } saveOrUpdate 2016-09-21 17:31:45,442 DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager.processRollback:847 - Initiating transaction rollback 2016-09-21 17:31:45,442 DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback:284 - Rolling back JDBC transaction on Connection [oracle.jdbc.driver.T4CConnection@cc49d2] 2016-09-21 17:31:45,442 DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager.doCleanupAfterCompletion:327 - Releasing JDBC Connection [oracle.jdbc.driver.T4CConnection@cc49d2] after transaction 2016-09-21 17:31:45,442 DEBUG org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection:327 - Returning JDBC Connection to DataSource 2016-09-21 17:31:45,442 ERROR org.apache.struts2.dispatcher.Dispatcher.error:38 - Exception occurred during processing request: null java.lang.NullPointerException at com.haier.hibernate.user.dao.impl.UserDaoImpl.save(UserDaoImpl.java:53) at com.haier.hibernate.user.service.impl.UserServiceImpl.save(UserServiceImpl.java:25) 还请各位大哥、大神赐教!
hibernate4.1 创建session 求助!
**我的测试类** package test; import org.hibernate.*; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import com.computer.cs.entity.Users; public class Test { private SessionFactory sessionFactory; private Session session; private Transaction transaction; public void init(){ Configuration config = new Configuration().configure(); //创建服务注册对象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); sessionFactory=config.buildSessionFactory(serviceRegistry); session=sessionFactory.openSession(); transaction=session.beginTransaction(); } public void destory(){ transaction.commit(); session.close(); sessionFactory.close(); } public void test(){ Users u = new Users("ee","1234567",(short)1,322); session.save(u); } public static void main(String[] args) { Test t1 = new Test(); t1.init(); t1.test(); t1.destory(); } } **下面是报错** log4j:WARN No appenders could be found for logger (org.jboss.logging). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Exception in thread "main" org.hibernate.HibernateException: /hibernate.cfg.xml not found at org.hibernate.internal.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:173) at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:1947) at org.hibernate.cfg.Configuration.configure(Configuration.java:1928) at org.hibernate.cfg.Configuration.configure(Configuration.java:1908) at test.Test.init(Test.java:18) at test.Test.main(Test.java:40) **hibernate配置文档** <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.url"> jdbc:mysql://127.0.0.1:3306/csdatabase </property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="myeclipse.connection.profile"> CSdatabase </property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">create</property> <mapping resource="com/computer/cs/entity/Users.hbm.xml" /> <mapping resource="com/computer/cs/entity/Inexp.hbm.xml" /> <mapping resource="com/computer/cs/entity/Project.hbm.xml" /> </session-factory> </hibernate-configuration> ![图片说明](https://img-ask.csdn.net/upload/201811/28/1543347724_772277.png) 初学框架,现在真的是一脸懵逼
session.save()会立即同步状态到数据库,不解!
先看代码: [code="java"] public static void main(String[] args) throws Exception { Configuration cfg = new Configuration(); SessionFactory sf = cfg.configure().buildSessionFactory(); Session session = sf.openSession(); //session.setFlushMode(FlushMode.MANUAL); session.beginTransaction(); Parent p = new Parent(); p.setName("hello"); session.save(p); System.out.println(1); p.setName("world"); System.out.println(2); session.getTransaction().commit(); session.close(); } [/code] 这是我的一段测试代码,Parent类除了id以外仅有一个name属性,我执行这段代码,在控制台的输出是这样的: [code="java"] Hibernate: insert into parent (name) values (?) 1 2 Hibernate: update parent set name=? where id=? [/code] 我的疑问是,为什么save方法会在打印语句之前将sql语句发送到数据库,是立即执行的,update方法的行为可以理解,提交事务时才同步到数据库,我记得以前save方法也不会立即发送sql的,而是flush或者commit时才会,我用的hibernate是3.3.1.GA版本的,难道是这个原因吗? 当我把session.setFlushMode(FlushMode.MANUAL)的注释去掉之后输出变成了这样: [code="java"] Hibernate: insert into parent (name) values (?) 1 2 [/code] 因为没有手动显式调用flush,所有后来的update并没有发出,但是save仍然是立即同步的,不解啊!
spring3与hibernate4整合session问题
[color=red][b]问题描述:[/b][/color] 整合spring3与hibernate4时,发生错误:[u]nested exception is org.hibernate.HibernateException: No Session found for current thread[/u] 之后查找资料,添加[u]:<prop key="hibernate.current_session_context_class">thread</prop>[/u]属性,报错:org.hibernate.HibernateException: createQuery is not valid without active transaction, 查找资料说,删除上面我添加的那个属性,我被陷入死循环了。 [color=red][b]代码如下[/b][/color] [b]配置文件:[/b] [code="java"] <?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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:config/jdbc.properties</value> </list> </property> </bean> <!--数据源--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>${mysql.driver}</value> </property> <property name="jdbcUrl"> <value>${mysql.url}</value> </property> <property name="user"> <value>${mysql.userName}</value> </property> <property name="password"> <value>${mysql.password}</value> </property> <property name="acquireIncrement"> <value>${c3p0.acquireIncrement}</value> </property> <property name="initialPoolSize"> <value>${c3p0.initialPoolSize}</value> </property> <property name="minPoolSize"> <value>${c3p0.minPoolSize}</value> </property> <property name="maxPoolSize"> <value>${c3p0.maxPoolSize}</value> </property> <property name="maxIdleTime"> <value>${c3p0.maxIdleTime}</value> </property> <property name="idleConnectionTestPeriod"> <value>${c3p0.idleConnectionTestPeriod}</value> </property> <property name="maxStatements"> <value>${c3p0.maxStatements}</value> </property> <property name="numHelperThreads"> <value>${c3p0.numHelperThreads}</value> </property> <property name="testConnectionOnCheckout"> <value>${c3p0.testConnectionOnCheckout}</value> </property> <property name="preferredTestQuery"> <value>${c3p0.preferredTestQuery}</value> </property> </bean> <!-- Session 工厂配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <value>com..entity</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <!-- 解决no session found --> <prop key="hibernate.current_session_context_class">thread</prop> </props> </property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 配置事物管理器,在*ServiceImpl里写@Transactional就可以启用事物管理 --> <tx:annotation-driven transaction-manager="transactionManager" /> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 方法对应的传播属性 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="merge*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="put*" propagation="REQUIRED" /> <tx:method name="use*" propagation="REQUIRED"/> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="count*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="list*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 事务控制位置,一般在业务层service --> <aop:config> <aop:pointcut id="txPointcut" expression="execution(* com..service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config> </beans> [/code] [b]DAO[/b] [code="java"] package com.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; public class BaseDao { @Autowired private SessionFactory sessionFactory; public Session getCurrentSession() { return sessionFactory.getCurrentSession(); } } [/code] [code="java"] package com.test.dao.impl; import java.util.List; import org.hibernate.Query; import org.springframework.stereotype.Repository; import com.test.BaseDao; import com.test.dao.IUserDao; import com.test.entity.User; @Repository public class UserDaoImpl extends BaseDao implements IUserDao{ @SuppressWarnings("unchecked") @Override public List<User> findAllUsers() { String hql = "FROM User"; Query query = getCurrentSession().createQuery(hql); return query.list(); } } [/code] 各层次的ioc都OK的,问题出在哪里,或者解答下原因也可以,我自己查找资料,谢谢了。
hibernate中sessionFactory问题
一对多映射 感觉没错,求解啊!!! ``` public class HibernateUtil { private static SessionFactory sessionFactory; private static Session session; static { //创建configuration对象,读取hibernate.cfg.xml文件,完成初始化 Configuration config = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); sessionFactory = config.buildSessionFactory(serviceRegistry); //16 } //获取sessionFactory public static SessionFactory getSessionFactory() { return sessionFactory; } //获取session对象 public static Session getSession() { session = sessionFactory.openSession(); return session; } //关闭会话 public static void closeSession(Session session) { if(session!=null) { session.close(); } } } public class Test { public static void main(String[] args) { add(); //14 } //将学生添加到班级 public static void add() { Grade g = new Grade("java一班", "java软件开发一班"); Student s1 = new Student("张三", "男"); Student s2 = new Student("慕女神","女"); g.getStudents().add(s1); g.getStudents().add(s2); //保存班级、学生信息 Session session = HibernateUtil.getSession(); //29 Transaction transaction = session.beginTransaction(); session.save(g); session.save(s1); session.save(s2); transaction.commit(); HibernateUtil.closeSession(session); } } 错误信息: Exception in thread "main" java.lang.ExceptionInInitializerError at com.imooc.entity.Test.add(Test.java:29) at com.imooc.entity.Test.main(Test.java:14) Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:185) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:135) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:385) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1790) at com.imooc.util.HibernateUtil.<clinit>(HibernateUtil.java:16) ... 2 more Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:138) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:188) at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:341) at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:507) at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:146) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:163) ... 6 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:135) ... 15 more Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for student in class com.imooc.entity.Grade at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:316) at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:310) at org.hibernate.mapping.Property.getGetter(Property.java:321) at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:444) at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:200) at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:82) ... 20 more ```
为什么session.delete()能找到并删除已经分离的数据库中要删的数据?
为什么detached状态下,session.delete()能找到并删除已经分离的数据库中要删的数据? 先session.save( t );再session.close()成detached状态。然后创建个新的session2,再session2.delete(t); 明明是detached状态,而且session已经关闭了,为什么hibernate还知道内存中的 t 和数据库中的列有关系。session和数据库不是已经关闭和脱离了吗?为什么hibernate还能准确的知道这个t对象就是对应数据库中的某个数据?
被Hibernate的Session绊了一跤
<p>写这篇博客的原因是出于昨天我在问答频道的一个问题,该问题如下:</p> <p> </p> <p><span style="font-family: Arial; line-height: 18px;">    当在servlet中调用DAO的save方法并提交事务后,控制台显示已经执行了sql语句,但是却没有向数据库中记录,如果把数据库的隔离级别设置为未提交读,这是可以看见刚插入的记录,但是之前已经调用了提交事务的语句,这是为什么呢? <br>注:主键生成策略为“native”,数据库是MySQL。<br><strong style="font-weight: bold;">问题补充:</strong><br>已经把数据库操作放到了事务中,而当第二条记录提交的时候才会向数据库中插入第一条记录,而新提交的记录不会被插入。<br><strong style="font-weight: bold;">问题补充:</strong></span></p> <p><span style="font-family: Consolas; line-height: 18px;"> <div class="bar"> <div class="tools" style="text-align: left; color: black; font-weight: bold; padding: 3px; margin: 0px;">Java代码 ;</div> </div> <ol class="dp-j" style="font-size: 1em; line-height: 1.4em; background-color: #ffffff; margin-top: 0px; margin-right: 0px; margin-bottom: 1px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; color: #2b91af; border: 1px solid #d1d7dc;"> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;"><span style="color: black;">UserDAO userDAO = </span><span class="keyword" style="color: #7f0055; font-weight: bold;">new</span><span style="color: black;"> UserDAO();  </span></span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        User user = <span class="keyword" style="color: #7f0055; font-weight: bold;">new</span><span style="color: black;"> User();  </span></span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">          </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        SessionFactory sessionFactory = HibernateSessionFactory.getSessionFactory();  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        Session session = sessionFactory.openSession();  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        Transaction tx = <span class="keyword" style="color: #7f0055; font-weight: bold;">null</span><span style="color: black;">;  </span></span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">          </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        user.setUsername(registerForm.getUsername());  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">          </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        user.setEmail(registerForm.getEmail());  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        <span class="keyword" style="color: #7f0055; font-weight: bold;">try</span><span style="color: black;"> {  </span></span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">            tx = session.beginTransaction();  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">            userDAO.save(user);  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">            tx.commit();  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        }  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        <span class="keyword" style="color: #7f0055; font-weight: bold;">catch</span><span style="color: black;"> (RuntimeException e) {  </span></span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">            <span class="keyword" style="color: #7f0055; font-weight: bold;">if</span><span style="color: black;"> (tx != </span><span class="keyword" style="color: #7f0055; font-weight: bold;">null</span><span style="color: black;">)  </span></span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">                tx.rollback();  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">            <span class="keyword" style="color: #7f0055; font-weight: bold;">throw</span><span style="color: black;"> e;   </span></span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        }  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        <span class="keyword" style="color: #7f0055; font-weight: bold;">finally</span><span style="color: black;"> {  </span></span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">            session.close();  </span></li> <li style="font-size: 1em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; padding-left: 10px; line-height: 18px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px;"><span style="color: black;">        }  </span></li> </ol></span></p> <p><span style="font-family: Arial; line-height: 18px;"> <div class="dp-highlighter" style="font-family: Consolas, 'Courier New', Courier, mono; font-size: 12px; background-color: transparent; width: 97%; margin-left: 9px; padding: 1px;"> <div class="bar"> <div class="tools" style="color: black; padding: 3px; margin: 0px;"><span style="font-family: Verdana; line-height: normal;">通过查看Hibernate的代码发现的其中的问题。</span></div> <div class="tools" style="color: black; padding: 3px; margin: 0px;">我在获得Session对象的时候采用的是 sessionFactory.openSession();  Hibernate会新产生一个Session对象,接着执行userDAO.save(user)语句,而UserDAO类的save方法中用到的Session是通过HibernateSessionFactory.getSession()方法获得的,再继续看HibernateSessionFactory,其getSession()方法如下</div> </div> <div class="tools" style="color: black; padding: 3px; margin: 0px;"> <pre name="code" class="java"> public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; }</pre> </div> <div class="tools" style="color: black; padding: 3px; margin: 0px;"> 因此HibernateSessionFactory会为每个线程创建一个Session对象,MyEclipse所生成的DAO类就是用的这个</div> <div class="tools" style="color: black; padding: 3px; margin: 0px;">Session,这与在程序中通过openSession()方法所得到的是两个不同的Session对象,因此我在程序中调用的提交事务方法是在后一个Session中进行的,而对User对象的保存是在第一个Session中,而该Session中并没有执行提交事务操作。</div> <div class="tools" style="color: black; padding: 3px; margin: 0px;">    但是,至于之前的为什么当我执行第二次插入操作时会把前一条记录插入的原因还没有弄清楚,哪位大哥知道,欢迎留言。</div> </div> <div class="tools" style="color: black; padding: 3px; margin: 0px;"><br></div> <div class="tools" style="color: black; padding: 3px; margin: 0px;"><br></div> </span></p>
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
深析Synchronized关键字(小白慎入,深入jvm源码,两万字长文)
目录一、synchronized基础1.1synchronized的使用1.1示例1.2验证1.2.1 普通方法和代码块中使用this是同一个监视器(锁),即某个具体调用该代码的对象1.2.2 静态方法和代码块中使用该类的class对象是同一个监视器,任何该类的对象调用该段代码时都是在争夺同一个监视器的锁定1.2、synchronized的特点二、synchronized进阶2.1对象头2.2sy
GitHub 总星 4w+!删库?女装?表情包?这些沙雕中文项目真是我每天快乐的源泉!
大家好,我是 Rocky0429,一个喜欢在 GitHub 上瞎逛的蒟蒻… 好看的皮囊千篇一律,有趣的灵魂没有底线。作为全球最大的同性交友网站,GayHub GitHub 上不止有鲜活的代码,秃头的算法,还有很多拥有有(sha)趣(diao)灵魂的宝藏。 还记得我之前给大家介绍的 Sorry 项目嘛,一个可以自己做表情包的项目,这个的沙雕程度在下面这些项目面前只能算弟弟。虽然说沙雕不分国...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
20道你必须要背会的微服务面试题,面试一定会被问到
这篇博客总结了面试中最常见的微服务面试题,相信对你有所帮助。
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
C语言数字图像处理---1.4直方图拉伸和直方图均衡化
本篇将延续上一篇的内容,对直方图进行扩展,讲述直方图拉伸和直方图均衡化两个内容,并通过简单的C语言来实现这两个基础功能,让初学者通俗易懂。
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
没用过这些 IDEA 插件?怪不得写代码头疼
使用插件,可以提高开发效率。对于开发人员很有帮助。这篇博客介绍了IDEA中最常用的一些插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
推荐一些有趣的在线编程游戏
1.Robocode 让坦克们互相博弈的游戏,你可以看到它们飞奔,碾碎一切挡道的东西。机器人配有雷达与火炮,选手在躲避对手进攻的同时攻击对手,以此来较量得分的多少。这个游戏很有意思,曾经令我沉迷… 你可以用Java、Scala、C#等编程语言,编写人工智能程序,驱动机器人。 2.Code Combat Code Combat是一款学习编程的角色扮演游戏。每一关都用任务的形式设立目标,用实时的反馈...
工作十年的数据分析师被炒,没有方向,你根本躲不过中年危机
2020年刚刚开始,就意味着离职潮高峰的到来,我身边就有不少人拿着年终奖离职了,而最让我感到意外的,是一位工作十年的数据分析师也离职了,不同于别人的主动辞职,他是被公司炒掉的。 很多人都说数据分析是个好饭碗,工作不累薪资高、入门简单又好学。然而今年34的他,却真正尝到了中年危机的滋味,平时也有不少人都会私信问我: 数据分析师也有中年危机吗?跟程序员一样是吃青春饭的吗?该怎么保证自己不被公司淘汰...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
张朝阳回应迟到 1 分钟罚 500:资本家就得剥削员工
loonggg读完需要2分钟速读仅需 1 分钟大家我,我是你们的校长。前几天,搜狐的董事局主席兼 CEO 张朝阳和搜狐都上热搜了。原因很简单,就是搜狐出了“考勤新规”。一封搜狐对员工发布...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
立即提问