Я пытаюсь собрать статистику посетителей для двух служб. Он состоит из ежедневной статистики посетителей и общей записи. К каждой службе могут быть доступны разные имена. Например, пользователь, администратор, поддержка и т. Д. Каждый будет иметь свою собственную запись как собственную статистику.Отображение 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 колонок: идентификатор (должен быть сопоставляется со вставкой = "ложь" обновление = "ложь")
Что не так с моим картографированием?
Да, вы правы. То же самое для «ServiceTwo». Я новичок в спящем и картографировании. – Dragon
Примите ответ! :) – Fortunato
Я не называю такие ссылки, как 'serviceOne' и' serviceTwo', потому что я хочу понять, как работает отображение. Мне гораздо легче сохранить такие имена в моем уме и «нарисовать» соответствующую картинку. – Dragon