Можно ли создавать два столбца в двунаправленных отношениях? - PullRequest
0 голосов
/ 04 февраля 2019

Можно ли создать один столбец для двунаправленных отношений?

Мои объекты:

@Entity
@Table(name = "subscription")
@Proxy(lazy = false)
public class Subscription {

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "subscription_id")
private long id;

@Column(name = "userid", nullable = false)
private String userId;

@Column(name = "saledate", nullable = false)
@Temporal(TemporalType.DATE)
private Date saleDate;

@Column(name = "finishdate", nullable = false)
@Temporal(TemporalType.DATE)
private Date finishDate;

@Column(name = "price", nullable = false)
private long price;

@Column(name = "description", nullable = false)
private String description;


@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "subscription")
private List<VisitDate> visitDates = new ArrayList<>();
}



@Entity
@Table(name="visitdate")

public class VisitDate {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private long id;
private long subscription;

@Column(name = "date", nullable = false)
@Temporal(TemporalType.DATE)
private Date date;
@ManyToOne
@JoinColumn(name="subscription_id")
private Subscription associatedSub;
}

Теперь я вижу два столбца в базе данных и немного запутался.

Я не хочу сохранять те же данные, но хочу отобразить отчет о том, сколько пользователей посетили за один день.

Обновление:

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вам не нужно создавать отдельное поле «подписка» в классе VisitDate.Hibernate автоматически создаст поле для хранения идентификатора подписки.Код должен быть слегка изменен.

@Entity
@Table(name = "subscription")
public class Subscription {

  @Id
  @GeneratedValue(strategy= GenerationType.IDENTITY)
  @Column(name = "subscription_id")
  private long id;

  @Column(name = "userid", nullable = false)
  private String userId;

  @Column(name = "saledate", nullable = false)
  @Temporal(TemporalType.DATE)
  private Date saleDate;

  @Column(name = "finishdate", nullable = false)
  @Temporal(TemporalType.DATE)
  private Date finishDate;

  @Column(name = "price", nullable = false)
  private long price;

  @Column(name = "description", nullable = false)
  private String description;

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "associatedSub")
  private List<VisitDate> visitDates = new ArrayList<>();
}

Обратите внимание, что я изменил свойство mappedBy так, чтобы оно указывало на relatedSub в вышеприведенном классе.

@Entity
@Table(name="visitdate")

public class VisitDate {
  @Id
  @GeneratedValue(strategy= GenerationType.IDENTITY)
  @Column(name = "id")
  private long id;

  @Column(name = "date", nullable = false)
  @Temporal(TemporalType.DATE)
  private Date         date;

  @ManyToOne
  @JoinColumn(name="subscription_id")
  private Subscription associatedSub;
}
0 голосов
/ 04 февраля 2019

Вы можете использовать однонаправленные отношения для той же цели.Вам просто нужно добавить список / набор посещений для определенной подписки, вам не нужно создавать список подписки для определенного посещения.для ознакомления Посетите [Java JPA]: (https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Undirectional_OneToMany.2C_No_Inverse_ManyToOne.2C_No_Join_Table_.28JPA_2.0_ONLY.29)!

@Entity
@Table(name = "subscription")
@Proxy(lazy = false)
public class Subscription {

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "subscription_id")
private long id;

@Column(name = "userid", nullable = false)
private String userId;

@Column(name = "saledate", nullable = false)
@Temporal(TemporalType.DATE)
private Date saleDate;

@Column(name = "finishdate", nullable = false)
@Temporal(TemporalType.DATE)
private Date finishDate;

@Column(name = "price", nullable = false)
private long price;

@Column(name = "description", nullable = false)
private String description;


@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "subscription")
private List<VisitDate> visitDates = new ArrayList<>();
}



@Entity
@Table(name="visitdate")

public class VisitDate {
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private long id;

private long subscription;

@Column(name = "date", nullable = false)
@Temporal(TemporalType.DATE)
private Date date;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...