Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Hibernate, один Entity для таблицы и view


Автор: unkis 29.3.2010, 17:52
Ребята у меня следующая проблема:

Есть таблица скаже "TableA", которя состоит из следующих параметров (p1,p2,p3)

Соответственно есть Entity "TableAEntity" который содержит/описывает эти три параметра(p1,p2,p3)


Также существует "ViewА" которое содержит эти три параметра(p1,p2,p3) плюс ещё два дополнительных(v1,v2) т.е. состоит из (p1,p2,p3,v1,v2)


Вот и вопрос: можно ли создать один Entity-Класс который бы мапил  "TableA" и "ViewА"?

Зарание спасибо

Автор: MaxPayneC 29.3.2010, 18:45
Да, возможно.
Код

create view admins_view as select admin_id, login, pwd_md5, concat(login, ' ', pwd_md5) as `field_concat` from admins;


Код

package com.vc.vacancies.model.entities.users;


import javax.persistence.*;

/**
 * todo class javadoc
 * <p/>
 * Date: 29.03.2010<br />
 * Time: 19:36:30<br />
 *
 * @author AdminView
 * @version 1.0
 */
@Entity
@Table(name = "admins_view")
public class AdminView
{
    private Integer id;

    private String login;

    private String password;

    private String concat;

    @Id
    @Column(name = "admin_id")
    @GeneratedValue
    public Integer getId()
    {
        return id;
    }

    public void setId(Integer id)
    {
        this.id = id;
    }

    @Basic
    @Column(name = "login")
    public String getLogin()
    {
        return login;
    }

    public void setLogin(String login)
    {
        this.login = login;
    }

    @Basic
    @Column(name = "pwd_md5")
    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    @Basic
    @Column(name = "field_concat")
    public String getConcat()
    {
        return concat;
    }

    public void setConcat(String concat)
    {
        this.concat = concat;
    }
}


Код

    public static void main(String[] args)
    {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        AdminView view = (AdminView) session.load(AdminView.class, 1);
        System.out.println("field_concat == " + view.getConcat());
    }


И в hibernate.cfg.xml прописать.
Идея в том, чтобы написать энтити для вью, а не для реальной таблицы. Если я правильно понял то, что вам нужно получить, это должно работать.

Автор: unkis 8.4.2010, 11:46
Цитата(MaxPayneC @  29.3.2010,  16:45 Найти цитируемый пост)
Идея в том, чтобы написать энтити для вью, а не для реальной таблицы. Если я правильно понял то, что вам нужно получить, это должно работать. 

Нет, идея как раз не в том чтобы для view  написать  entity,  а в том чтбы создать один, так сказать универсальный entity, который бы подходил и для таблицы и для view

Автор: MaxPayneC 8.4.2010, 12:24
Тогда это невозможно, т.к. класс мапится на одну таблицу(вьюху) и честно говоря я не понимаю зачем это может быть нужно.

Автор: Joss 8.4.2010, 15:45
Можно попробовать извратиться... Написать MappedSuperclass который будет содержать общие поля, и унаследовать от него 2 entity. если сильно нужно конечно...

Автор: MisterCleric 8.4.2010, 16:44
А можно так в hbm.xml: 
Код

<class name="my.company.app.User" table="USER" entity-name="user">
        <id column="ID" name="id" type="java.lang.Long">
            <generator class="org.hibernate.id.SequenceGenerator">
                <param name="sequence">GEN_USER</param>
            </generator>
        </id>
        <property column="USER_NAME" name="userName" type="java.lang.String"/>
    </class>
    
    <class name="my.company.app.User" table="VUSER" entity-name="vuser">
        <id column="ID" name="id" type="java.lang.Long"/>
        <property column="USER_NAME" name="userName" type="java.lang.String"/>
    </class>


и манипулировать Entity не по классу, а по вот тому хитрому атрибуту entity-name

Да, об этом написано в книге http://www.google.com/search?q=java+persistence+with+hibernate
Глава 3, страница 147

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)