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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отношения в таблицах 
V
    Опции темы
salat
Дата 17.12.2009, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 23.11.2009

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



Уважаемые форумчане, подскжите пожалуйста, как организовать следующее отношение:

Есть 2 таблицы, первая Person(id, login, password) уже содержит данные о пользователях. Вторая таблица Results(id, theme, count_for, count_against). Суть таблиц, ну так для понимания, первая - просто пользователи, вторая - голосование с темой и счетчиками за и против. Вопрос заключается в следующем: как организовать связи между этими сущностями. В count_for и count_against должны находиться колекции объектов типа person. Допустим если пользователь проголосовал "за", то добавляем объект в count_for, если против то соответственно в count_against. Как я понимаю нужна односторонняя связь OneToMany, но как её организовать, ведь она получается относиться к конкретному полю(count_for или count_against),а не к сущности results в целом. Может кто прольет свет. Заранее благодарен.
PM MAIL   Вверх
Akeem
Дата 17.12.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 14.7.2006
Где: Киев/Украина

Репутация: нет
Всего: 3



а какая разница если ты будеш писать как 
Results.count_for --> Person.id
Results.count_against --> Person.id

в мапинге будет Collection<Person> getCountFor
Collection<Person> getCountAgainst



--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

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


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 23.11.2009

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



А вообще связь то между ними нужна?
PM MAIL   Вверх
Akeem
Дата 17.12.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 14.7.2006
Где: Киев/Украина

Репутация: нет
Всего: 3



ну как обычно OneToMany

П.С. Я бы сделал ентити 
Код

@Entity
Results
{
................
@OneToMany
Person countForPersons;

@OneToMany
Person countAgainstsPersons;

................
}




Это сообщение отредактировал(а) Akeem - 17.12.2009, 21:17


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
salat
Дата 17.12.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 23.11.2009

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



Как я понял код должен выглядеть так. Это односторонняя связь, в "PERSON" ничего не указывается?

Код

@Entity
@Table(name = "RESULTS")
@NamedQueries({@NamedQuery(name = "Results.findAll", query = "SELECT r FROM Results r"),
@NamedQuery(name = "Results.findById", query = "SELECT r FROM Results r WHERE r.id = :id"),
@NamedQuery(name = "Results.findByTheme", query = "SELECT r FROM Results r WHERE r.theme = :theme"),
@NamedQuery(name = "Results.findByCountFor", query = "SELECT r FROM Results r WHERE r.countFor = :countFor"),
@NamedQuery(name = "Results.findByCountAgainst", query = "SELECT r FROM Results r WHERE r.countAgainst = :countAgainst"),
@NamedQuery(name = "Results.findByIsActive", query = "SELECT r FROM Results r WHERE r.isActive = :isActive")})
public class Results implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID", nullable = false)
    @GeneratedValue
    private Integer id;
    @Basic(optional = false)
    @Column(name = "THEME")
    private String theme;
    @Column(name = "COUNT_FOR")
    @OneToMany
    private Collection<Person> countFor;
    @Column(name = "COUNT_AGAINST")
    @OneToMany
    private Collection<Person> countAgainst;
    @Column(name = "IS_ACTIVE")
    private Integer isActive;

    public Results() {
    }

    public Results(Integer id) {
        this.id = id;
    }

    public Results(Integer id, String theme) {
        this.id = id;
        this.theme = theme;
    }

    public Integer getId() {
        return id;
    }

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

    public String getTheme() {
        return theme;
    }

    public void setTheme(String theme) {
        this.theme = theme;
    }

    public Collection<Person> getCountFor() {
        return countFor;
    }

    public void setCountFor(Person person) {
        countFor.add(person);
    }

    public Collection<Person> getCountAgainst() {
        return countAgainst;
    }

    public void setCountAgainst(Person person) {
        countAgainst.add(person);
    }

    public Integer getIsActive() {
        return isActive;
    }

    public void setIsActive(Integer isActive) {
        this.isActive = isActive;
    }

PM MAIL   Вверх
Joss
Дата 18.12.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.3.2006

Репутация: нет
Всего: 1



Как мне кажется, между голосованиями и пользователями должно быть отношение многие ко многим.
PM MAIL   Вверх
salat
Дата 20.12.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 23.11.2009

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



Да  Joss, ты прав - @ManyToMany.
PM MAIL   Вверх
salat
Дата 22.12.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 23.11.2009

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



В итоге нужно было разбить результирующию таблицу на 2 (по одной на каждую коллекцию). NetBeans создавал одну, общую. Что вызывало проблемы с записью, (коллекций)сущностей в неё.

Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package votesystem;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name = "RESULTS")
@NamedQueries({@NamedQuery(name = "Results.findAll", query = "SELECT r FROM Results r"),
@NamedQuery(name = "Results.findByIdResults", query = "SELECT r FROM Results r WHERE r.idResults = :idResults"),
@NamedQuery(name = "Results.findByTheme", query = "SELECT r FROM Results r WHERE r.theme = :theme"),
@NamedQuery(name = "Results.findByCountFor", query = "SELECT r FROM Results r WHERE r.countFor = :countFor"),
@NamedQuery(name = "Results.findByCountAgainst", query = "SELECT r FROM Results r WHERE r.countAgainst = :countAgainst"),
@NamedQuery(name = "Results.findByIsActive", query = "SELECT r FROM Results r WHERE r.isActive = :isActive")})
public class Results implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "ID_RESULTS", nullable = false)
    @GeneratedValue
    private Integer idResults;
    @Column(name = "THEME")
    private String theme;
    @JoinTable(name="PERSON_FOR")
    @JoinColumn(name = "COUNT_FOR")
    @ManyToMany
    private Collection<Person> countFor;
    @JoinTable(name="PERSON_AGAINST")
    @JoinColumn(name = "COUNT_AGAINST")
    @ManyToMany
    private Collection<Person> countAgainst;
    @Column(name = "IS_ACTIVE")
    private Integer isActive;

    public Results() {
    }

    public Results(String theme) {
        this.theme = theme;
        this.countFor = new ArrayList<Person>();
        this.countAgainst = new ArrayList<Person>();
        this.isActive = 1;
    }

    public Results(Integer idResults) {
        this.idResults = idResults;
    }

    public Integer getIdResults() {
        return idResults;
    }

    public void setIdResults(Integer idResults) {
        this.idResults = idResults;
    }

    public String getTheme() {
        return theme;
    }

    public void setTheme(String theme) {
        this.theme = theme;
    }
    
    public Collection<Person> getCountFor() {
        return countFor;
    }

    public void setCountFor(Collection<Person> person) {
        this.countFor = person;
    }

    public Collection<Person> getCountAgainst() {
        return countAgainst;
    }

    public void setCountAgainst(Collection<Person> person) {
        this.countAgainst = person;
    }

    public Integer getIsActive() {
        return isActive;
    }

    public void setIsActive(Integer isActive) {
        this.isActive = isActive;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idResults != null ? idResults.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Results)) {
            return false;
        }
        Results other = (Results) object;
        if ((this.idResults == null && other.idResults != null) || (this.idResults != null && !this.idResults.equals(other.idResults))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "votesystem.Results[idResults=" + idResults + "]";
    }

}

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

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

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


 




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


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

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