1

私はそれらの2つのテーブルTeacherとContactを持っています、教師はxのContactsを持つことができます。そこで、ここでは@OneToManyアソシエーションを見ています。

テーブル構造:

ユーザー[userid、username、email、...]
連絡先[contactid、contactname、ref、reftype、...]

ユーザークラスからすべてのユーザーの連絡先をロードしたい。それを行うには、次のようなクエリを実行します

Select * from contact as c WHERE c.ref=8240 AND c.reftype='T';

8240はランダムなユーザーIDであり、reftypeTはTeacher用です。この連絡先テーブルは、学校の連絡先やその他のタイプの顧客にも使用されます。問題は、Hibernateでこれを行う方法がわからないことです。 embedbedIdを使用する必要がありますか?またはJoinColumns?

私がこれまでに行ったことは、私の先生を持っている連絡先にリンクするcontact.ref=teacher.teacheridことですが、私が欲しいのは:

contact.ref=teacher.teacherid AND contact.reftype='T'

それ、どうやったら出来るの?

これが私のコードTeacher.classです

private Integer teacherid;
private Set<Contact> contact;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "teacherid", unique = true, nullable = false)
public Integer getTeacherId() {
    return teacherid;
}

 @OneToMany(fetch = FetchType.EAGER)
 @JoinColumns({
     @JoinColumn(name="ref"),
 })
public Set<Contact> getContact() {
    return contact;
}

public void setContact(Set<Contact> contact) {
    this.contact = contact;
}

Contact.class

@Entity
@Table(name = "contact")
public class Contact implements java.io.Serializable {

    private Integer contactid;
    private String contactname;
    private String contacttype;
    private String reftype;
    private int ref; 

    /*private Teacher teacher;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "ref"),
        @JoinColumn(name = "reftype")
    })
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher (Teacher teacher) {
        this.teacher= teacher;
    }
*/
    private Set<ContactItem> contactItems;
    private Set<ContactAddress> contactAddressess;

    @OneToMany(fetch=FetchType.EAGER)
    @JoinColumn(name="contactid")
    public Set<ContactItem> getContactItems(){
        return contactItems;
    }

    public void setContactItems(Set<ContactItem> contactItems) {
        this.contactItems = contactItems;
    }

    @OneToMany(fetch=FetchType.EAGER)
    @JoinColumn(name="contactid")
    public Set<ContactAddress> getContactAddressess(){
        return contactAddressess;
    }

    public void setContactAddressess(Set<ContactAddress> contactAddressess) {
        this.contactAddressess = contactAddressess;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "contactid", unique = true, nullable = false)
    public Integer getContactid() {
        return this.contactid;
    }

    public void setContactid(Integer contactid) {
        this.contactid = contactid;
    }

    @Column(name = "contactname", nullable = false)
    public String getContactname() {
        return this.contactname;
    }

    public void setContactname(String contactname) {
        this.contactname = contactname;
    }

    @Column(name = "contacttype", nullable = false)
    public String getContacttype() {
        return this.contacttype;
    }

    public void setContacttype(String contacttype) {
        this.contacttype = contacttype;
    }

    @Column(name = "reftype", nullable = false, length = 1)
    public String getReftype() {
        return this.reftype;
    }

    public void setReftype(String reftype) {
        this.reftype = reftype;
    }

    @Column(name = "ref", nullable = false)
    public int getRef() {
        return this.ref;
    }

    public void setRef(int ref) {
        this.ref = ref;
    }

    public String toString(){
        return "\n#"+this.contactname+" : ("+this.ref+"-"+this.reftype+") \n" 
                    +"#Items-----\n"+getContactItems()+"\n" 
                    +"#Address---\n"+getContactAddressess()+"\n";
    }
}
4

2 に答える 2

0

TeacherそれがUserであり、すべてのユーザーがを持っていると仮定しますcontacts

User.class

@OneToMany(mappedBy = "user", targetEntity = Contact.class, orphanRemoval=true)
@Cascade(CascadeType.ALL)
private Set<Contact> contacts = new ConcurrentSkipListSet<Contact>();

//No setContacts here. 

Contact.class

@ManyToOne
private User user;

public void setUser(User user){
this.user = user;
}

それでおしまい。

于 2010-09-21T12:03:49.387 に答える
0

まず、User テーブルがあり、Teacher テーブルがないため (教師は「タイプ」列で示されるユーザー行のサブセットのようです)、User テーブルと Teacher モデルはありません。代わりに User モデルのみを使用します。Hibernateの方法で物事を行う場合、Hibernate ははるかに簡単です。これは、モデルが同じ名前を持つテーブルごとに 1 つのモデルです。たとえば、これを行うと、ツールを使用してすべてのモデル クラスを自動生成 (リバース エンジニアリング) できます。これは、Hibernate ツールがテーブルや外部キーなどを調べて、テーブルに適切なJava コードを生成することを意味します。テーブルの変更を開始するときに非常に便利です。

通常は、モデル クラスをリバース エンジニアリングします。これらは機械で生成されたものであるため、次回モデルをリバース エンジニアリングするときに変更が上書きされるため、変更したくありません。あなたのような条件に対して私が行うことは、DAO (Data Access Object、または DAO) と呼ばれるクラスを作成することです。

public class UserDAO {
    public static User getTeacher(EntityManager em, Long id) {
        try {
        IForgotTheType query = em.createQuery("User from User user, Contact contact where contact.ref=user.teacherid AND contact.reftype='T' and User.id=:id");
        query.setParameter("id", id);
        return (User) query.getSingleResult();
        } catch (NoResultException e) {
           return null;
        } catch (Exception e) {
           throw new RuntimeException(e);
        }
} 

明らかに、テーブル構造と列名についてはわかりませんが、アイデアはわかります。上記のクエリにコードを挿入した場所を確認できます。UserDAO.getTeacher() を呼び出すだけで教師を取得できるようになりました。DAO を使用してください。そうしないと、コードのいたるところに Hibernate コードがあり、メンテナンスがより困難になります。

この のセクション 3.4 を確認してください

于 2010-09-21T12:23:09.200 に答える