2013-12-06 2 views
0

Я пытаюсь собрать статистику посетителей для двух служб. Он состоит из ежедневной статистики посетителей и общей записи. К каждой службе могут быть доступны разные имена. Например, пользователь, администратор, поддержка и т. Д. Каждый будет иметь свою собственную запись как собственную статистику.Отображение Hibernate в Java: org.hibernate.MappingException: Повторяющийся столбец при сопоставлении для объекта

Вот мой DB структура:

service_one: идентификатор, имя

service_two: идентификатор, имя

daily_stats: идентификатор, дата, service_one_id, service_one_visitors, service_two_id, service_two_visitors, overall_visitors

record_stats: id, service_one_id, service_one_record, service_one_record_date, servi ce_two_id, service_two_record, service_two_record_date

Вот отношения между таблицами:

service_one --- (один ко многим) ---> daily_stats (service_one_id)

service_one --- (один ко многим) ---> record_stats (service_one_id)

service_two --- (один ко многим) ---> daily_stats (service_two_id)

service_two --- (один ко многим) ---> record_stats (service_two_id)

Mapping для service_one (то же самое для service_two). Также сеттеры были опущены для того, чтобы сократить пример:

@Entity 
@Table(name = "service_one") 
public class ServiceOne implements Serializable { 
    private int id; 
    private String name; 

    private Set<RecordStats> recordStats = new HashSet<RecordStats>(0); 
    private Set<DailyStats> dailyStats = new HashSet<DailyStats>(0); 

    public ServiceOne() {} 

    public ServiceOne(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id", nullable = false, unique = true) 
    public int getId() { 
     return id; 
    } 

    @Column(name = "name") 
    public String getName() { 
     return name; 
    } 

    @OneToMany(fetch = LAZY, mappedBy = "service_one_id") 
    public Set<RecordStats> getRecordStats() { 
     return recordStats; 
    } 

    @OneToMany(fetch = LAZY, mappedBy = "service_one_id") 
    public Set<DailyStats> getDailyStats() { 
     return dailyStats; 
    } 
} 

daily_stats отображение:

@Entity 
@Table(name = "daily_stats", uniqueConstraints = { 
     @UniqueConstraint(columnNames = "date") 
}) 
public class DailyStats implements Serializable{ 

    private int id; 
    private Date date; 
    private ServiceOne service_one_id; 
    private int service_one_visitors; 
    private ServiceTwo service_two_id; 
    private int service_two_visitors; 
    private int overall_visitors; 

    public DailyStats() {} 

    public DailyStats(DailyStats rec) { 
     this.id = rec.getId(); 
     //... 
    } 

    @Id 
    @GeneratedValue 
    @Column(name = "id", nullable = false) 
    public int getId() { 
     return id; 
    } 

    @Temporal(DATE) 
    @Column(name = "date") 
    public Date getDate() { 
     return date; 
    } 

    @ManyToOne(fetch = LAZY) 
    @JoinColumn(name = "id", nullable = false) 
    public ServiceOne getService_one_id() { 
     return service_one_id; 
    } 

    @Column(name = "service_one_visitors") 
    public int getService_one_visitors() { 
     return service_one_visitors; 
    } 

    @ManyToOne(fetch = LAZY) 
    @JoinColumn(name = "id", nullable = false) 
    public ServiceTwo getService_two_id() { 
     return service_two_id; 
    } 

    @Column(name = "service_two_visitors") 
    public int getService_two_visitors() { 
     return service_two_visitors; 
    } 

    @Column(name = "overall_visitors") 
    public int getOverall_visitors() { 
     return overall_visitors; 
    } 
} 

record_stats отображение:

@Entity 
@Table(name = "record_stats", uniqueConstraints = { 
     @UniqueConstraint(columnNames = "service_one_record_date"), 
     @UniqueConstraint(columnNames = "service_two_record_date") 
}) 
public class RecordStats implements Serializable { 

    private int id; 
    private ServiceOne service_one_id; 
    private int service_one_record; 
    private Date service_one_rec_date; 
    private ServiceTwo service_two_id; 
    private int service_two_record; 
    private Date service_two_rec_date; 

    public RecordStats() {} 

    public RecordStats(RecordStats rec) { 
     this.id = rec.getId(); 
     //... 
    } 

    @Id 
    @GeneratedValue 
    @Column(name = "id", nullable = false) 
    public int getId() { 
     return id; 
    } 

    @ManyToOne(fetch = LAZY) 
    @JoinColumn(name = "id", nullable = false) 
    public ServiceOne getService_one_id() { 
     return service_one_id; 
    } 

    @Column(name = "service_one_record") 
    public int getService_one_record() { 
     return service_one_record; 
    } 

    @Column(name = "service_one_record_date") 
    @Temporal(DATE) 
    public Date getService_one_rec_date() { 
     return service_one_rec_date; 
    } 

    @ManyToOne(fetch = LAZY) 
    @JoinColumn(name = "id", nullable = false) 
    public ServiceTwo getService_two_id() { 
     return service_two_id; 
    } 

    @Column(name = "service_two_record") 
    public int getService_two_record() { 
     return service_two_record; 
    } 

    @Column(name = "service_two_record_date") 
    @Temporal(DATE) 
    public Date getService_two_rec_date() { 
     return service_two_rec_date; 
    } 
} 

Попытка создать новую запись кидает исключение:

public static void main(String[] args) { 
    ServiceOne serviceOne = new ServiceOne(); 
    serviceOne.setName("test"); 

    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
    Session session = sessionFactory.openSession(); 

    session.beginTransaction(); 
    session.save(serviceOne); 
    session.getTransaction().commit(); 

    //get records 
    session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    List result = session.createQuery("from service_one").list(); 
    for (ServiceOne o : (List<ServiceOne>)result) { 
     System.out.println(o.getName()); 
    } 
    session.getTransaction().commit(); 

    session.close(); 
} 

org.hibernate.MappingException: Повторный столбец отображения для объекта: VisitorsCounter.model.entity.DailyStats колонок: идентификатор (должен быть сопоставляется со вставкой = "ложь" обновление = "ложь")

Что не так с моим картографированием?

ответ

1

Мне кажется, что

@JoinColumn(name = "id", nullable = false) 
public ServiceOne getService_one_id() { 
    return service_one_id; 
} 

в DailyStats неправильно; у вас должно быть name = "service_one_id".

У вас эта же проблема в getService_two_id() и в тех же названиях в RecordStats.

Могу ли я спросить, почему вы не называете ссылки в классах полей serviceOne и serviceTwo вместо service_one_id и service_two_id.

+0

Да, вы правы. То же самое для «ServiceTwo». Я новичок в спящем и картографировании. – Dragon

+0

Примите ответ! :) – Fortunato

+0

Я не называю такие ссылки, как 'serviceOne' и' serviceTwo', потому что я хочу понять, как работает отображение. Мне гораздо легче сохранить такие имена в моем уме и «нарисовать» соответствующую картинку. – Dragon

Смежные вопросы

 Смежные вопросы