weixin_42297864
2008-11-08 12:10
浏览 382
已采纳

JPA中在OneToMany中引用子类时出现的问题--再贴一次

呵呵,在这里http://www.iteye.com/problems/6486已经有过讨论了,但soartju兄弟一句"很全面了"导致了无人跟贴,哈哈,只好再贴一次,顺谢jones和soartju两位兄弟.
问题:当Client采用OnToMany关联到Sub1时,如果被关联方(Sub1)是Super的子类(单表策略),就无法通过client.getSub1()方法获取到正确的结果(最终获得的结果相当于client.getSuper(),即将全部super对象返回了,而不是返回对应的sub1对象).
但:[quote][/quote]所有的sub1dao方法都返回了正确的结果.
例举如下:

1)超类:
@Entity
@Table(name="person")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING, length=50)
public class Person {}
2)子类:
@Entity
@DiscriminatorValue(value="SellerLeader")
public class SellerLeader extends Person {
/**

  • 所属经销商
  • @return 所属经销商 / @ManyToOne @JoinColumn(name = "dealer_id", referencedColumnName = "id") public Seller getSeller() { return seller; } } 3)客户类: @Entity @Table(name="seller") public class Seller extends Dealer { /*
  • 上级经销商
  • @return */ @ManyToMany @JoinTable(name="distributor_seller", joinColumns=@JoinColumn(name="seller_id", referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="distributor_id", referencedColumnName="id")) public Set getDistributors() { return distributors; } } 4)测试(由于是单表策略,person表共6条记录,其中SellerLeader有4条): Seller seller = sellerDao.get(-2L); Assert.assertEquals(4, seller.getLeaders().size());//注意:测试失败,告知说有6条而不是4条. Assert.assertEquals(4, sellerLeaderDao.getAll().size());//测试成功,说有4条. 5)另外,所有的sellerLeaderDao方法都是成功的,也就是说多态本身是没有问题的,就是在ontomany关系中使用多态出问题了. [b]问题补充:[/b] to jones: 呵呵,子类代码贴错了,更改如下: @Entity @Table(name="seller") public class Seller extends Dealer { private Set leaders; @OneToMany(cascade = CascadeType.ALL, mappedBy="seller") public Set getLeaders() { return leaders; } } [b]问题补充:[/b] 再晕,Seller是客户类,不是子类. [b]问题补充:[/b] Dealer @MappedSuperclass public abstract class Dealer { private String address; ....(没有相关内容) } [b]问题补充:[/b] 太感谢了! 就是它:@ForceDiscriminator.呵呵,居然不属于JPA规范.
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • iteye_521 2008-11-08 13:28
    已采纳
    点赞 打赏 评论
  • iteye_521 2008-11-08 12:41

    在你的Seller类中我怎么找不到getLeaders()方法相关信息啊,把父类贴出来或者把子类贴完整一下吧

    点赞 打赏 评论
  • iteye_521 2008-11-08 13:13

    Dealer 是你Seller 的父类,我是这个意思,呵呵

    点赞 打赏 评论
  • iteye_521 2008-11-08 13:26

    问题可能找到了,真隐蔽啊,你应该在你的父类上使用
    [code="java"]@ForceDiscriminator[/code]注解来声明强制鉴别器,试试行不行

    点赞 打赏 评论
  • iteye_521 2008-11-08 13:27

    @ForceDiscriminator 的文档真是太少了,都含糊不清

    点赞 打赏 评论

相关推荐 更多相似问题