怎么把这两个表的操作放在一个事务里

注册表和用户表,注册表中UserId列外键关联于用户表主键在实际开发中,数据库中的两张表并没有设置外键关联,而是要在工程中用事务控制在一起。//5.更新用户表UsersM... 注册表和用户表,注册表中UserId列外键关联于用户表主键
在实际开发中,数据库中的两张表并没有设置外键关联,而是要在工程中用事务控制在一起。
// 5.更新用户表
UsersModel user = new UsersModel();
user.setUsername(phone);
user.setPassword(md5Password);
usersService.save(user);

// 6.更新注册表
RegistryModel registry = new RegistryModel();
registry.setMobileNumber(phone);
registry.setCallingStationId(mac);
registry.setUserId(user.getId());//将用户表的id取出来保存在注册表里,实现关联
registryService.save(registry);

正确的代码该怎么写呢?

以上的代码在实际运行时,用户表可以保存,注册表中registry对象可以创建而且也有值,但是就在registryService.save(registry);这一步报空指针异常,调试发现实际是保存了一下,但是保存完之后事务就回滚了。

这是为什么呢?正确的代码该怎么写?
展开
 我来答
LMLU23
2015-03-06 · TA获得超过901个赞
知道小有建树答主
回答量:373
采纳率:0%
帮助的人:368万
展开全部
你给的信息太少,我只能猜下。
你是不是使用hibernate?user的id是不是自动生成的?如果是,那么在registry.setUserId的时候,id是null。hibernate自动生成的值都是在数据库操作后才存在的,你可能使用Spring的事务,因此真正的数据库操作是发生在这个请求结束之后,也就是session.close之后。
你可以将setUserId(user.getId())修改为setUser(user)来实现关联,而不是通过自动生成的ID,记得修改映射或者注解。
追问
你猜的都是对的,棒棒哒!!
既然要改成setUser(user)的话,那是不是就要在registry的实体类中增加一个User属性,就是维护一个User对象,就像这样

Set user = new HashSet();

可是我们一个搞过两年开发的人说他实际开发的时候不写这个。
追答
为什么要用集合?不是一个RegistryMode只对应一个UsersModel吗?只要添加User user这种属性就可以了。

直接使用User来关联才是面向对象的,hibernate也提倡不要在业务逻辑中使用其自动生成的属性。如果使用自动生成的属性进行关联,hibernate的操作会变得很困难,还不如使用原生的JDBC操作呢。
当然如果你们老前辈有其他经验,也可以借鉴一下。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式