Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hibernate mapping 
:(
    Опции темы
Samotnik
Дата 31.8.2010, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Добрый день. 
Помогите плиз замапить поля.
Есть сущности channels и phones
Я их замапил вот так 
Channel.hbm.xml
Код

<hibernate-mapping package="logic">
  <class name="Channel" table="channels">
    <id column="channel_id" name="id" type="java.lang.Long">
        <generator class="increment"></generator></id>
    <property name="name" column="name" type="java.lang.String"></property>    
  </class>
</hibernate-mapping>


Phone.hbm.xml
Код

<hibernate-mapping package="logic">
  <class name="Phone" table="phones">
    <id column="phone_id" name="id" type="java.lang.Long">
        <generator class="increment"></generator></id>
    <property name="token" column="token" type="java.lang.String"></property>
    <property name="dev_id" column="dev_id" type="java.lang.String"></property>    
    <property name="counter" column="counter" type="java.lang.Long"></property>
  </class>
</hibernate-mapping>


Теперь нужно замапить третью сущность subscription у которой будет всего 3 поля. Первое это айдишник, а второе и третье поле, это айдишники из phone и channel  соответсвенно.
1. subscription_id
2. phone_id
3. channel_id

Я начал делать вот так 
Код

<hibernate-mapping package="logic">
  <class name="Subscription" table="subscription">
    <id column="subscription_id" name="id" type="java.lang.Long">
        <generator class="increment"></generator></id>
    
А вот тут нужно что-то написать, чтобы замапить второе и третье поле. Чтобы айдишники из первой и второй сущности были тут

  </class>
</hibernate-mapping>

PM MAIL   Вверх
MisterCleric
Дата 31.8.2010, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38





--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 31.8.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



это наверное не совсем то. 
История такова. 
Есть в БД 3 таблицы. Phones, Channels, Subscription.
Ранее в коде был маппинг только на две первые таблицы. Это : 
Phone.hbm.xml
Код

<hibernate-mapping package="logic">
  <class name="Phone" table="phones">
    <id column="phone_id" name="id" type="java.lang.Long">
        <generator class="increment"></generator></id>
    <property name="token" column="token" type="java.lang.String"></property>
    <property name="dev_id" column="dev_id" type="java.lang.String"></property>
    <set name="topics" table="subscription" lazy="false">
        <key column="phone_id"/>
        <many-to-many column="topic_id" class="logic.Topic"></many-to-many>
        
    </set>
    <property name="counter" column="counter" type="java.lang.Long"></property>
  </class>
</hibernate-mapping>

И Channel.hbm.xml 
Код

<hibernate-mapping package="logic">
  <class name="Channel" table="channels">
    <id column="channel_id" name="id" type="java.lang.Long">
        <generator class="increment"></generator></id>
    <property name="name" column="name" type="java.lang.String"></property>
    <set name="phones" lazy="false" table="subscription">
        <key column="channel_id"/>
        <many-to-many column="phone_id" class="logic.Phone"></many-to-many>

    </set>
  </class>
</hibernate-mapping>


А логика была такая :
Phone.java :
Код

public class Phone {
    private Long id;
    private Set<Channel> topics = new HashSet<Channel>();
      
//.....

    public Set getChannels() {
        return topics;
    }
    public void setChannel(Set channels) {
        this.channels = channels;
    }
}

Channel.java :
Код

public class Channel{
    private Long id;
    private Set<Phone> phones = new HashSet<Phone>();
      
//.....

    public Set getTopics() {
        return topics;
    }
    public void setTopics(Set topics) {
        this.topics = topics;
    }
}


т.е. третья таблица не мапилась. 

Теперь нужно сделать маппинг на эту третью таблицу. И также добавить логику. В этом и вопрос, как сделать маппинг на третью сущность.
Я, если честно, не совсем понимаю почему раньше небыло маппинга на эту третью таблицу. Как оно вообще работало. А теперь нужно сделать маппинг, т.е. чтобы было 3 класса логики, а не 2, т.е. на каждую таблицу в БД - свой класс в приложении.

Более того, вот в этом  примере, тоже почему то 3 таблицы в БД, а маппинг сделан только на две. Вот этот пример очень похож на мою струтктуру.
PM MAIL   Вверх
Vasay
Дата 31.8.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

Репутация: 11
Всего: 73



Цитата(Samotnik @  31.8.2010,  20:48 Найти цитируемый пост)
Более того, вот в этом  примере, тоже почему то 3 таблицы в БД, а маппинг сделан только на две. Вот этот пример очень похож на мою струтктуру.



там связь Many-to-Many третья таблица выступает связующим звеном.



--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
MisterCleric
Дата 1.9.2010, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Привет. А что тебя пугает. Все выходить хорошо и отлично.
Если мы меппим две сущности между собой, а они связаны через третью таблица, то это ManyToMany.
А если желаешь иметь еще и третью сущность, как у тебя subscription, то это ManyToOne и бидирекешн к нему OneToMany.
Все ж просто:
1. Phone имеет много subscription, значит OneToMany и коллекция subscription в Phone.
2. Channel имеет много subscription, значит OneToMany и коллекция subscription в Channel.
3. А вот subscription может быть много к одному Phone, значит ManyToOne mappedBy subscription
4. И аналогично по subscription относительно Channel

В твоем случае надо смотреть на все твои три сущности как на таблицы. А тебя же не пугает такая ихняя связь в БД, вот и свяжи их точно также как и БД.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 1.9.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



MisterCleric, я все равно не понимаю что на что мапить  smile 
так ?
Channel.java
Код

@Entity
@Table(name = "CHANNELS")
public class Channel implements Serializable {
    /**
     *  Default serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
      
    public Channel() {
        super();
    }

    @Id
    @GeneratedValue
    @Column(name = "CHANNEL_ID")
    @ManyToOne(cascade = CascadeType.ALL)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Column(name = "NAME", nullable = false, length = 250)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}


Phone,java
Код

@Entity
@Table(name = "PHONES")
public class Phone implements Serializable {
    /**
     * Default serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    private Long id;
    private String token;
    private String dev_id;
    private Long counter;
      
    public Phone() {
        super();
    }

    @Id
    @GeneratedValue
    @Column(name = "PHONE_ID")
    @ManyToOne(cascade = CascadeType.ALL)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Column(name = "TOKEN", nullable = false, length = 250)
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }
    @Column(name = "DEV_ID", nullable = false, length = 100)
    public String getDev_id() {
        return dev_id;
    }
    public void setDev_id(String dev_id) {
        this.dev_id = dev_id;
    }
    @Column(name = "COUNTER", nullable = false, length = 100)
    public Long getCounter() {
        return counter;
    }
    public void setCounter(Long counter) {
        this.counter = counter;
    }
}




А что тогда в Subscription.java мапить ?

Добавлено через 4 минуты и 24 секунды
вот так штоле ? 
Код

@Entity
@Table(name = "SUBSCRIPTION")
public class Subscription implements Serializable{
    /**
     * Default serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    private Long id;
    private Set<Channel> channels = new HashSet<Channel>();
    private Set<Phone> phones = new HashSet<Phone>();
    
    public Subscription() {
        super();
    }
    
    @Id
    @GeneratedValue
    @Column(name = "ID")    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }    
    public Set<Channel> getChannels() {
        return channels;
    }
    public void setChannels(Set<Channel> channels) {
        this.channels = channels;
    }
    public Set<Phone> getPhones() {
        return phones;
    }
    public void setPhones(Set<Phone> phones) {
        this.phones = phones;
    }
}

PM MAIL   Вверх
Vasay
Дата 1.9.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

Репутация: 11
Всего: 73



Samotnik, 

Что Вы этим хотите сказать?

Код

    @ManyToOne(cascade = CascadeType.ALL)
    public Long getId() {
        return id;
    }




--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Samotnik
Дата 1.9.2010, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата(Vasay @  1.9.2010,  12:20 Найти цитируемый пост)
Что Вы этим хотите сказать?

что это поле, должно быть замапленно на другую таблицу связью вида manyToOne
PM MAIL   Вверх
Samotnik
Дата 1.9.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



меня интересует 
- какие поля помечать и какими связями в Phone, Channel
- каким поля и чем помечать в Subscription
- где теперь будут находится коллекции 
    private Set<Channel> channels = new HashSet<Channel>();
    private Set<Phone> phones = new HashSet<Phone>();

 smile 
Немогли бьы вы разъяснить
PM MAIL   Вверх
Vasay
Дата 1.9.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

Репутация: 11
Всего: 73



Samotnik, 
Цитата(Samotnik @  1.9.2010,  12:21 Найти цитируемый пост)
что это поле, должно быть замапленно на другую таблицу связью вида manyToOne



А где у Вас видно, с чем Вы мапите

 тьфу, не то хотел сказать -  а где видно с каким классом Вы связываете Channel?


http://en.wikibooks.org/wiki/Java_Persistence/ManyToOne

Это сообщение отредактировал(а) Vasay - 1.9.2010, 12:46


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Samotnik
Дата 1.9.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Vasay, а по делу есть что сказать ? Я ведь конкретные вопросы задаю.

Цитата(Samotnik @  1.9.2010,  12:40 Найти цитируемый пост)
меня интересует 
- какие поля помечать и какими связями в Phone, Channel
- каким поля и чем помечать в Subscription
- где теперь будут находится коллекции 
    private Set<Channel> channels = new HashSet<Channel>();
    private Set<Phone> phones = new HashSet<Phone>();
 smile 
Немогли бьы вы разъяснить 


PM MAIL   Вверх
Vasay
Дата 1.9.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

Репутация: 11
Всего: 73



Samotnik, 

Я тебе намекаю. И ссылку дал с подсказкой.

Добавлено через 2 минуты и 25 секунд
Вот еще одна - там найдешь про коллекции: http://en.wikibooks.org/wiki/Java_Persistence/OneToMany


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Samotnik
Дата 1.9.2010, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Vasay, я ничего не понимаю.  smile 
PM MAIL   Вверх
Samotnik
Дата 1.9.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



вот так ? : 
Channel.java
Код

@Entity
@Table(name = "CHANNELS")
public class Channel implements Serializable {
    /**
     *  Default serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    
    @OneToMany(mappedBy="CHANNELS")
    private Set<Phone> phones = new HashSet<Phone>();
      
    public Channel() {
        super();
    }

    @Id
    @GeneratedValue
    @Column(name = "CHANNEL_ID")
    @ManyToOne(cascade = CascadeType.ALL)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Column(name = "NAME", nullable = false, length = 250)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public boolean equals(Object c){
        return (id.compareTo(((Channel)c).id)==0);
    }
    public Set<Phone> getPhones() {
        return phones;
    }
    public void setPhones(Set<Phone> phones) {
        this.phones = phones;
    }
}


Phone.java
Код

@Entity
@Table(name = "PHONES")
public class Phone implements Serializable {
    /**
     * Default serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    private Long id;
    private String token;
    private String dev_id;
    private Long counter;
    
    @OneToMany(mappedBy="PHONES")
    private Set<Channel> channels = new HashSet<Channel>();
      
    public Phone() {
        super();
    }

    @Id
    @GeneratedValue
    @Column(name = "PHONE_ID")
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Column(name = "TOKEN", nullable = false, length = 250)
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }
    @Column(name = "DEV_ID", nullable = false, length = 100)
    public String getDev_id() {
        return dev_id;
    }
    public void setDev_id(String dev_id) {
        this.dev_id = dev_id;
    }
    @Column(name = "COUNTER", nullable = false, length = 100)
    public Long getCounter() {
        return counter;
    }
    public void setCounter(Long counter) {
        this.counter = counter;
    }
    public Set<Channel> getChannels() {
        return channels;
    }
    public void setChannels(Set<Channel> channels) {
        this.channels = channels;
    }
}


А что в  Subscription.java писать ?

Добавлено через 11 минут и 59 секунд
Я думаю, что это не верно. 
Поскольку класс Phone ничего не должен знать о Channel   и наоборот. 
Собственно для этого и нужна эта реструктуризация. Чтобы коллекции слить в новый класс Subscribe.
PM MAIL   Вверх
Vasay
Дата 1.9.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

Репутация: 11
Всего: 73



Цитата(Samotnik @  1.9.2010,  13:13 Найти цитируемый пост)
вот так ? : 



нет.

Насколько я понимаю,  Channel может иметь много Phone ? А Phone много Channel? Так? Если так то у тебя уже связь не OneToMany а ManyToMany. 


С другой стороны, судя потому что ты описывал в одном из первых постов - тебе нужен класс Subscription. Я не совсем понимаю (хотя и догадываюсь), что ты с ним хочешь делать, потому, давай так - ты сейчас возьмеш какой-нибудь редактор блоксхем и нарисуешь свои классы или таблицы, а потом нарисуешь связи между ними, примерно как здесь:

http://upload.wikimedia.org/wikipedia/comm...-ManyToOne2.jpg

и запостишь сюда.

Я так подозреваю, что ты хочешь чтобы Phone не знал о Channel и наоборот.
Но была бы некая Subscription, которая имела бы коллекцию Channel и коллекцию Phone. Тогда у тебя должны быть связи OneToMany между Subscription и Channel, а так же между Subscription и Phone. Хотя это только в том случае, если телефон может иметь только одну Subscription.


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.