IVYcong 2011-01-07 13:01
浏览 577
已采纳

spring+hibernate(一对多)向数据库添加数据

有两个问题:
[b][color=red][size=large]1、spring和hibernate中的一对多问题(包括添加、删除和更行)~我现在这么写代码规范吗?

2、总感觉项目里加了spring之后,处理事务的速度变得慢了很多~比只是加入hibernate的时候慢~这是神马原因呢?[/size][/color][/b]
数据库有两个表:“user”和“order”;一个“user”对应多个“order”;user表的外键关联在“order”表中

具体的Dao借口都继承了泛型的Dao(泛型Dao里面有spring的数据操作)

现在我想在“order”里面添加数据~测试结果现在添加失败~但没有Exception;以下是我的代码,问题应该就在[color=red][size=large]“OrderServiceImpl”[/size][/color]中;

(Spring:ApplicationContext.xml)

[code="java"] 1. <!-- -->



  1. <!-- -->

  2. <!-- -->





    1. <!-- -->

    2. <!-- -->










    3. <!-- -->

    4. <!-- -->

















    5. <!-- --> [/code]

User.hbm.xml

[code="java"] 1.














  1. [/code]

Order.hbm.xml

[code="java"] 1.

















  1. [/code]

OrderDaoImpl(向数据库底层添加数据)
[code="java"]
public class OrderDaoImpl extends GenericHibernateDaoImpl implements OrderDao {

boolean success =false;

public boolean addOrder(Order order) {

    success=saveObj(order);
    System.out.println("save order");
    return success;
}

[/code]

[b][color=red]OrderServiceImpl(这层和用户沟通~问题出现在这代码当中:第16~19行)[/color][/b]

[code="java"] 1. public boolean addOrder(String orderName, Integer orderStatue,

  1. String userName,Integer version) {
  2. ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
  3. Order order = (Order)ctx.getBean("Order");
  4. userService = (UserService) ctx.getBean("UserService");
  5. orderDao=(OrderDao)ctx.getBean("OrderDao");

  6. boolean success = false;

    1. Integer userId = userService.findUserId(userName);//get a UserID by userName
    2. User user = userService.findUser(userId);//get an User by UserID

    3. order.setOrderName(orderName);
    4. order.setOrderStatue(orderStatue);
    5. order.setVersion(version);
    6. order.setUser(user);//set an "user" into the order;

    7. try {
    8. success=orderDao.addOrder(order);//保存“order”结果提示返回的“success”值为“false”,应该怎么办好呢?
    9. } catch (Exception e) {
    10. success = false;
    11. e.printStackTrace();
    12. }

    13. return success;
    14. } [/code]

如果单单用sql语句是可以插入的~但是我想用hibernate的特性把参数值set进去~thanks

  • 写回答

12条回答 默认 最新

  • lang_shao 2011-01-10 12:03
    关注

    [quote]现在经你提点,一对多添加数据确实成功了~然而有新问题出现~我原来的思路是先查找出一个User~然后再根据这个User来添加他的Order~应该只是在Order表里面新增数据才合理~但是按照我写的程序~问题是:User表里同样会新增一个同名的User(只是ID不同)~新插入的Order所关联的User也是新增的那个同名User~这样的结果是不合符程序设计的原意~出现此问题的原因是:在执行完泛型Dao的Save()方法后 session被关闭了~难道又要想hibernate那样把所有事物都放在BeginTransaction()和commit()当中完成吗?这样做会出现很多重复的代码~不符合设计的原则吧~希望你能够指点一下~
    [/quote]

    这一整个应该在一个事务中啊,在这个事务提交之前,session不会关闭。
    [code="java"]
    User user = userService.findUser(userId);//get an User by UserID

    order.setUser(user);

    user.addOrcer(order);

    updateUser(user); // 这应该是update
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器