怎么把这两个表的操作放在一个事务里
注册表和用户表,注册表中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);这一步报空指针异常,调试发现实际是保存了一下,但是保存完之后事务就回滚了。
这是为什么呢?正确的代码该怎么写? 展开
在实际开发中,数据库中的两张表并没有设置外键关联,而是要在工程中用事务控制在一起。
// 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);这一步报空指针异常,调试发现实际是保存了一下,但是保存完之后事务就回滚了。
这是为什么呢?正确的代码该怎么写? 展开
1个回答
展开全部
你给的信息太少,我只能猜下。
你是不是使用hibernate?user的id是不是自动生成的?如果是,那么在registry.setUserId的时候,id是null。hibernate自动生成的值都是在数据库操作后才存在的,你可能使用Spring的事务,因此真正的数据库操作是发生在这个请求结束之后,也就是session.close之后。
你可以将setUserId(user.getId())修改为setUser(user)来实现关联,而不是通过自动生成的ID,记得修改映射或者注解。
你是不是使用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操作呢。
当然如果你们老前辈有其他经验,也可以借鉴一下。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询