package nju.seec.helper.entity; import lombok.Data; import lombok.experimental.Accessors; import nju.seec.helper.enums.QuizState; import nju.seec.helper.enums.QuizType; import org.hibernate.annotations.*; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.ForeignKey; import javax.persistence.Table; import javax.persistence.*; import java.time.LocalDateTime; import java.util.List; /** * @author sheen *

* updated by cst */ @Data @Accessors(chain = true) @Entity @Table(name = "quiz", uniqueConstraints = @UniqueConstraint(name = "quiz_name_unique", columnNames = {"delete_at", "slide_id", "name",})) @DynamicInsert @DynamicUpdate @Where(clause = "delete_at = 0 and slide_id in (select s.id from slide s where s.delete_at = 0) and course_id in (select c.id from course c where c.delete_at = 0)") //@Cacheable //@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Quiz { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Basic @Column(name = "name", nullable = false) private String name; @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.LAZY) @JoinColumn(name = "course_id", foreignKey = @ForeignKey(name = "quiz_course")) private Course course; @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.LAZY) @JoinColumn(name = "slide_id", foreignKey = @ForeignKey(name = "quiz_slide")) private Slide slide; @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.LAZY) @JoinColumn(name = "teacher_id", foreignKey = @ForeignKey(name = "quiz_teacher")) private User teacher; @Type(type = "json") @Column(columnDefinition = "json", nullable = false) private List questions; @Enumerated(value = EnumType.STRING) @Column(name = "type", nullable = false) private QuizType type; @Enumerated(value = EnumType.STRING) @Column(name = "state", nullable = false) private QuizState state; @Column(name = "max_submit_number", nullable = false) private Integer maxSubmitNumber; @Column(name = "create_at", nullable = false, updatable = false) @CreationTimestamp private LocalDateTime createAt; @Column(name = "update_at", nullable = false) @UpdateTimestamp private LocalDateTime updateAt; @ColumnDefault("0") @Column(name = "delete_at", nullable = false) private Long deleteAt = 0L; }