you  know!hibernate 多对多的时候,中间表记录是自动生成的。但是如果我要在中间表需要加入一个“是否有效”字段active。,还有些其他字段。
1。取出记录的时候,默认显示的是所有关联的有效的记录
2。增加的时候加入相关信息
3。我并不要直接删除。在删除的时候只让它变为无效字段。请问这种情况是否能用多对多的映射。很失望,没有查到相关的文档介绍有关在中间表生成和删除的时候可以变得灵活点,对hibernate也是不太熟悉,简单用用可以。所以上来问问。之前没有实际用过多对多,只是学习时测试过。还请大家指点,或者数据库设计有什么问题?

解决方案 »

  1.   

    你的这种业务,不能用多对多实现。在hibernate的reference中,提到:
    真实的多对多很少,往往在关联信息中需要保存更多的信息。
    这时候就不能用多对多了。
    应该用双向的一对多来实现,就是 A和B多对多,那么需要一个中间对象比如为C
    就是A和C是一对多,
    然后B和C也是一对多。
    在C中就同时引用A和B,同时加入你想要的其它属性。最后,因为你并不真正删除中间数据,所以需要特别的方法取得没有被删除的数据,就是对数据作一个过滤。
      

  2.   

    hibernate 多对多 我也只是测试用过
    没有深入了解
    呵呵
    关注学习一下
      

  3.   

    hibernate的reference中提到过吗。谢谢你的回答。这种办法我当时也想了下。感觉插入记录的时候可能会稍复杂些。原本以为或许哪里可以有控制的。我看了文档,没有看到,对hibernate大多东西都是一知半解。最后问你一个问题。不知道也没关系,就结贴了。其实中间表信息不多,重要的是过滤那块,hibernate的配置文件属性太多,多的让我总觉得少了什么。以为那里面可以控制。刚才看了一下,没有
    找到。如果a.getCs()之后然后自己写循环过滤吧,感觉那样效率低下。自己写sql直接session执行吧,配置一对多、多对多的,感觉就没有意义了。哎。有没有其他的方法?
      

  4.   

    @lushan1314
    你应该创建一个中间表的对象,比如刚才说的C
    然后在A和B里面创建一个方法
    叫做,getCVAlidList()//取得有效的c列表,这个使用session.createQuery实现
    这样就能够达到你的过滤的目的,在这种情况下,记住:
    永远不要调用,原来的getCList,因为这个调用没有意义(删除的和未删除的都在里面),不需要将cList取出再过滤,这样太浪费了。
      

  5.   

    还是得写sql,我现在用的是spring的getHibernateTemplate().find("查询语句")的,
    或者this.getSession().createQuery()。这两种方法调用sql的。
    如果这样,不配置映射文件也可以通过sql实现。感觉配置就成多余了,不知道我的理解对不对。
    我就是想效率高点。hibernate也不清楚到底怎么用效率才高。哎,效率是个很让人烦的话题,我资历浅,功能实现都没有问题,就是谈到效率我就头疼了。谢谢你的回答。先实现的再说了。