代码之家  ›  专栏  ›  技术社区  ›  black sensei

多对多(自参考问题)与双一对多

  •  1
  • black sensei  · 技术社区  · 16 年前

    我面临一些问题,你们中的一些人已经讨论过了,很抱歉再次提出这个问题。

    就好像我还是不知道 hibernate . 我在用 maven2 ,请 hibernate 3.2.5 ga , spring 2.6.5 SEC01 , hsqldb 1.8.0.10 , netbeans 6.7.1 .

    我正在构建一个用户和contat管理,并且在我的环境中,我已经设法在“联系人”和“组POJO”之间建立起一种“多对多”的工作关系。 hsql mysql 5.0.51 但是不在本地测试服务器上,因为我不想尝试双一对多的关联,所以在引入中介模型的情况下,我很少想问关于该映射的问题。

    下面是我的映射(我只是发布了避免长时间发布的必要内容)

    //UserAccount POJO
    
    @OneToMany(targetEntity=PhoneImpl.class, cascade= {CascadeType.ALL})
    @org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private Set<Phone> phones = new HashSet<Phone>();
    
    @OneToMany(targetEntity=ContactImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount")
    @org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private Set<Contact> contacts = new HashSet<Contact>();
    
    @OneToMany(targetEntity=GroupImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount")
    @org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private Set<Group> groups = new HashSet<Group>();
    
    
    //Contact POJO
    
    @ManyToOne(targetEntity=UserAccountImpl.class)
    @JoinColumn(name="USER_ACCOUNT_ID",nullable=false)
    private UserAccount userAccount;
    
    @OneToMany(targetEntity=PhoneImpl.class, cascade={CascadeType.ALL})
    private Set<Phone> phones = new HashSet<Phone>();
    
    @ManyToMany(targetEntity=GroupImpl.class, mappedBy="contacts")
    private Set<Group> groups=new HashSet<Group>();
    
    
    //Group  POJO
    @ManyToOne(targetEntity=UserAccountImpl.class)
    @JoinColumn(name="USER_ACCOUNT_ID",nullable=false)
    private UserAccount userAccount;
    
    @ManyToMany(targetEntity=ContactImpl.class,cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name="GROUP_CONTACT_MAP", joinColumns={@JoinColumn(name="GROUP_ID")},
    inverseJoinColumns={@JoinColumn(name="CONTACT_ID")})
    private Set<Contact> contacts = new HashSet<Contact>();
    

    所以这在我使用hsqldb和本地mysql的机器上很好工作,但是对于使用相同mysql 5.0的本地测试服务器来说,这是不一样的。下面是我的问题:

    1。 在本地测试服务器上,有一个要联系的和组的自引用外键。我已经阅读过循环引用的内容,但无法真正判断是否是这种情况。映射中是否有任何可以生成此类自引用外键的内容。或者我未能避免循环引用的内容?

    2。 我使用的是Hibernate的Maun-Java持久化,这是一本很棒的书,从我开始练习Hibernate的用法。在这本书中,它是一个11到多个关联。我只是不知道如何在实践中使用它,因为我想切换到那个方法。

    二点一 所以我最担心的是如何获得所有在一个组中的联系人和所有在其中有联系人的组?我就是看不清楚。

    第2.2条 如果采用这种方法,联系人和组将如何相互引用?他们会互相忽视吗? 也许这些是像你这样的Java程序员的基本经验,所以请原谅我的无知,如果你能给我一些启发的话,我会很高兴的。

    谢谢你的阅读!

    1 回复  |  直到 16 年前
        1
  •  1
  •   Paul Adamson    16 年前

    一些想法:

    0:您确定在使用hsqldb和mysql之间更改了hibernate方言吗?

    1:我想如果你有一个无法解决的/循环引用,你可能会有例外。

    2.**:您将创建一个名为contactToGroup的新类,它将具有 contact 场与A group 字段,每个字段都是 多对一结束。两个 Contact Group 类将有一组 contactToGroup . 您可以像这样查询:

    from Contact c 
    left join fetch c.contactToGroupSet joinTable 
    left join fetch joinTable.Group
    

    这将为您提供所有通过ContactToGroup对象连接的联系人及其组集。

    将contact、contact to group和group对象一起创建,也可以写入这些表。

    祝你好运!