Hibernate - OneToMany - несколько столбцов - PullRequest
0 голосов
/ 21 сентября 2010

У меня есть эти 2 таблицы Учитель и контакт, учитель может иметь х контактов. Итак, здесь мы смотрим на ассоциацию @OneToMany.

Состав столов:

Пользователь [ИД пользователя, имя пользователя, адрес электронной почты, ...]
Контакт [contactctid, имя контакта, ref, reftype, ...]

Я хочу загрузить из своего пользовательского класса все контакты пользователя. Для этого я бы сделал запрос вроде

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

8240 - случайный ИД пользователя и reftype T - для Учителя. Поскольку эта таблица контактов также используется для контактов в школе и / или для любого другого типа клиентов, который у нас может быть. Проблема в том, что я понятия не имею, как это сделать с 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";
    }
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2010

Во-первых, поскольку есть таблица User и таблица Teacher (учителя кажутся подмножеством пользовательских строк, обозначаемых столбцом type), у меня не было бы таблицы User и модель учителя. Вместо этого у меня была бы только пользовательская модель. Hibernate будет намного проще, если вы будете делать это способом Hibernate, то есть одна модель на таблицу с моделью с одинаковым именем. Например, если вы сделаете это, вы можете использовать инструмент для автоматической генерации (обратного инжиниринга) всех ваших классов моделей. Это означает, что инструмент Hibernate будет просматривать ваши таблицы, внешние ключи и т. Д. И генерировать соответствующий Java-код для ваших таблиц. Очень очень удобно, когда вы начинаете вносить изменения в таблицу.

Обычно вы перепроектируете классы моделей. Так как они генерируются машиной, вы не хотите их менять, потому что в следующий раз эти изменения будут перезаписаны для обратного инжиниринга моделей. Что я делаю для таких условий, как ваше, - это создать класс, называемый DAO - Объект доступа к данным или 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 настоящего .

0 голосов
/ 21 сентября 2010

Предполагая, что 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;
}

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...