Как создать журнал или таблицу истории для пользователя в MySQL и Hibernate

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

Мое требование: у меня есть таблица пользователей с ролями admin / user и таблица устройств. В таблице устройств у меня есть столбец с именем createdBy, который указывает userId, кто добавил устройство. Пользователь может обновлять статус устройства, поэтому каждый раз, когда значение или статус устройства изменяется, мне нужно регистрировать это. Я использую отдельную таблицу под названием DeviceHistory для регистрации этого.

Я застрял в реализации этого в спящем режиме.

  • следует ли использовать userId в качестве поля int в таблице устройств и таблице device_history?
  • следует ли использовать OneToOne сопоставление идентификатора пользователя в таблице устройств и таблице deviceHistory
  • следует ли использовать OneToMany сопоставление для таблицы устройства и истории устройства и OneToOne сопоставление от устройства к таблице пользователя. Пожалуйста, поделитесь ссылками, если есть какой-либо образец кода для такого сценария

Таблица пользователей - содержит сведения о пользователе

@Entity
@Table(name = "user")
public class User {

    @Id 
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="id", unique = true, nullable = false)
    @Column(name="user_id")
    private int userId;

    @Column(name="name")
    @Nonnull
    private String name;

    @Column(name="password")
    @Nonnull
    private String password;

    @Column(name="role")
    private String role;

    @Column(name="creation_date", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP", insertable=false, updatable=false)
    @Generated(GenerationTime.INSERT)
    @Temporal(TemporalType.TIMESTAMP)
    @Nonnull
    private Date creationDate;

    @Column(name="approved_date")
    @Temporal(TemporalType.TIMESTAMP)
    private Date approvedDate;

    @Column(name="approved_by")
    private int approvedBy;

}

Таблица устройств: содержит сведения об устройстве

@Entity
@Table(name = "device")
public class Device {

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", unique = true, nullable = false)
    @Column(name="device_id")
    private String deviceId;

    @Column(unique=true, name="serial_number")
    @Nonnull
    private String serialNumber;

    @Column(name="creation_date")
    @Generated(GenerationTime.INSERT)
    @Temporal(TemporalType.TIMESTAMP)
    @Nonnull
    private Date creationDate;

    @Column(name="created_by")
    private int createdBy;

}

Таблица DeviceHistory: здесь история, в которой пользователь обновил статус устройства и когда был сохранен.

@Entity
@Table(name = "device_history")
public class DeviceHistory {

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", unique = true, nullable = false)
    private int id;

    @Column(name="device_id")
    @Nonnull
    private String deviceId;

    @Column(name="notes")
    private String notes;

    @Column(name="last_modified_date")
    @Generated(GenerationTime.INSERT)
    @Temporal(TemporalType.TIMESTAMP)
    @Nonnull
    private Date lastModifiedDate;

    @Column(name="last_modified_by")
    private int lastModifiedBy;
}

person Madhu    schedule 30.08.2016    source источник
comment
Используйте блок кода только для форматирования кода, а не для текста вопроса.   -  person Steffen Harbich    schedule 30.08.2016


Ответы (1)


Вы должны использовать отображение ManyToOne в устройстве для пользователя. Точно так же в DeviceHistory вы должны использовать сопоставление ManyToOne для DeviceId и lastModifiedBy.

Ваше устройство и DeviceHistory должны быть:

@Entity
@Table(name = "device")
public class Device {

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="device_id", unique = true, nullable = false)
    private String deviceId;

    @Column(unique=true, name="serial_number")
    @Nonnull
    private String serialNumber;

    @Column(name="creation_date")
    @Generated(GenerationTime.INSERT)
    @Temporal(TemporalType.TIMESTAMP)
    @Nonnull
    private Date creationDate;

    @ManyToOne(optional = false)
    @JoinColumn(name="created_by")
    private User createdBy;

}

@Entity
@Table(name = "device_history")
public class DeviceHistory {

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", unique = true, nullable = false)
    private int id;

    @ManyToOne(optional = false)
    @JoinColumn(name="device_id")
    private Device deviceId;

    @Column(name="notes")
    private String notes;

    @Column(name="last_modified_date")
    @Generated(GenerationTime.INSERT)
    @Temporal(TemporalType.TIMESTAMP)
    @Nonnull
    private Date lastModifiedDate;

    @ManyToOne(optional = false)
    @JoinColumn(name="last_modified_by")
    private User lastModifiedBy;
}

Вы можете рассмотреть возможность двунаправленного сопоставления OneToMany для пользователя и устройства, если хотите получить все устройства, созданные пользователем. Для этого вам нужно будет использовать аннотацию OneToMany для устройств в сущности User.

person Md Zahid Raza    schedule 30.08.2016