关于Session接口的update方法主要有如下几点要注意

 

1.输入参数

一般而言,传递给update的对象要是处于游离状态的对象。如果传一个持久化对象,那么update方法就是多余的,因为Hibernate的脏检查机制会自动根据对象属性值的变化向数据库发送一条update语句;如果传入的对象处于临时状态,那么此时Hibernate应该会抛出异常。因为Hibernate在更新数据时会根据对象的OID去数据库查找相应的记录并更新之,而在数据库中是没有记录与这个临时对象相关联的,因此Hibernate会抛出异常,当然如果你人为的给临时对象指定一个OID就该另当别论了,如下所示代码片段:

Customer customer=new Customer();

customer.setId(3L);

customer.setName(“Cindyelf”);

session.update(customer);

这段代码会导致如下的sql:update Customer set name=’Cindyelf’ where  id=3;当然如果数据库不存在id为3的那行记录,Hibernate就会抛出异常。而给临时对象指定OID是不合规范的操作,应尽量避免。也就是说不管传入是什么状态对象,数据库中必须要有一条记录与这个对象的OID相对应,否则抛出异常。

2.操作

执行update方法的时候,Hibernate会首先把传入的对象放入Session的缓存中,使之持久化,然后计划执行一个update语句。Hibernate在生成sql语句的时候会根据对象的当前属性值来组装sql语句,也就是说,不管程序中修改了多少次属性值,在执行时只会执行一条update一句。

此外,在update的官方API中特意强调了一点,“如果在session的缓存中有一个持久化对象和所要更新的对象具有相同的OID,那么Hibernate会抛出异常”。下面的代码片段演示了这个错误:

Customer customer=new Customer();

session1.save(customer);

 

Customer customer1=(Customer)session.load(Customer.class,new Long(6))

session2.update(customer);

 

如上所示,我在session1中持久化了一个Customer对象,它的OID是6,然后我在session2中load一个OID为6的对象customer1,然后在session2中update之前的customer,注意,对于session2而已,customer1是处于游离状态的,因为它不处于session2的缓存中。此时程序会报如下错误:a different object with the same identifier value was already associated with the session。

转载于:https://www.cnblogs.com/anuoruibo/archive/2012/03/20/2407948.html

在Node.js中使用MySQL来实现登录接口时,有以下几种使用session方法: 1. 使用express-session模块:该模块可以将session存储在数据库中,而不是默认的内存存储。可以使用MySQL作为session存储的数据库,从而实现登录功能。具体实现步骤如下: - 安装express-session和mysql模块:npm install express-session mysql - 在应用程序中引入express-session和mysql模块,并配置session存储方式为MySQL - 在登录成功后,将用户信息存储在session中 - 在需要验证登录状态的接口中,获取session中的用户信息,判断用户是否登录 示例代码: const session = require('express-session'); const MySQLStore = require('express-mysql-session')(session); const mysql = require('mysql'); const options = { host: 'localhost', port: 3306, user: 'root', password: 'password', database: 'session_test' }; const sessionStore = new MySQLStore(options); app.use(session({ secret: 'my_secret_key', resave: false, saveUninitialized: false, store: sessionStore })); app.post('/login', (req, res) => { const { username, password } = req.body; // 验证用户名密码 if (验证成功) { req.session.user = { username }; res.json({ code: 0, msg: '登录成功' }); } else { res.json({ code: -1, msg: '用户名或密码错误' }); } }); app.get('/user', (req, res) => { const user = req.session.user; if (user) { res.json({ code: 0, data: user }); } else { res.json({ code: -1, msg: '未登录' }); } }); 2. 使用express-mysql-session模块:该模块可以直接将session存储到MySQL数据库中,无需手动存储。具体实现步骤与第一种方法类似,只是使用的session存储方式不同。示例代码: const session = require('express-session'); const MySQLStore = require('express-mysql-session')(session); const options = { host: 'localhost', port: 3306, user: 'root', password: 'password', database: 'session_test' }; const sessionStore = new MySQLStore(options); app.use(session({ secret: 'my_secret_key', resave: false, saveUninitialized: false, store: sessionStore })); // 登录验证和获取用户信息的代码与第一种方法相同 3. 使用node-mysql-session模块:该模块可以将session存储在MySQL数据库中,但需要手动存储和获取session。具体实现步骤如下: - 安装node-mysql-session模块:npm install node-mysql-session - 初始化MySQL连接池 - 在登录成功后,生成session ID,并将用户信息和session ID存储在MySQL数据库中 - 在需要验证登录状态的接口中,获取session ID,从MySQL数据库中获取用户信息,并判断用户是否登录 示例代码: const mysql = require('mysql'); const MySQLStore = require('node-mysql-session')(session); const pool = mysql.createPool({ host: 'localhost', port: 3306, user: 'root', password: 'password', database: 'session_test' }); app.post('/login', (req, res) => { const { username, password } = req.body; // 验证用户名密码 if (验证成功) { const sessionId = 生成session ID; const user = { username }; const sql = 'INSERT INTO sessions(id, data) VALUES(?, ?)'; pool.query(sql, [sessionId, JSON.stringify(user)], (err, result) => { if (err) { res.json({ code: -1, msg: '登录失败' }); } else { res.json({ code: 0, msg: '登录成功' }); } }); } else { res.json({ code: -1, msg: '用户名或密码错误' }); } }); app.get('/user', (req, res) => { const sessionId = 获取session ID; const sql = 'SELECT * FROM sessions WHERE id = ?'; pool.query(sql, [sessionId], (err, result) => { if (err || result.length === 0) { res.json({ code: -1, msg: '未登录' }); } else { const user = JSON.parse(result[0].data); res.json({ code: 0, data: user }); } }); }); 以上是在Node.js中使用MySQL来实现登录接口时,使用session的几种方法。具体使用哪种方法,可以根据实际需求和项目情况进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值