Код: Выделить всё
Caused by: java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes
Код: Выделить всё
@Entity
@Table(name = "session_table")
public class Session {
@EmbeddedId
private CompositeKey compositeKey;
@ManyToOne
@MapsId("examId")
@JoinColumn(name = "exam_id", insertable = false, updatable = false)
private Exam exam;
@ManyToOne
@MapsId("studentId")
@JoinColumn(name = "student_id", insertable = false, updatable = false)
private Student student;
@Temporal(TemporalType.DATE)
private Date examDate;
private float mark;
}
Код: Выделить всё
@Embeddable
public class CompositeKey implements Serializable {
@Column(name = "exam_id")
private int examId;
@Column(name = "student_id", length = 36)
private String studentId; // studentId is a UUID
// constructors, getters, setters, equals, hashCode
}
Код: Выделить всё
@Entity
@Table (name="student_table")
public class Student {
public Student(){}
@Id
@Column(name = "student_id", length = 36)
private String idStudent;
private String nameStudent;
@ManyToMany(fetch = FetchType.EAGER)
private List listExams = new ArrayList();
public Student(String nameStudent){
this.nameStudent = nameStudent;
this.idStudent = UUID.randomUUID().toString();
}
// class methods
}
Столбец Student_id должен быть VARCHAR(36) (поскольку это UUID) , но Hibernate генерирует VARCHAR(255) (из-за сопоставления @ManyToOne).
Это несоответствие вызывает исключение SQLSyntaxErrorException, поскольку сгенерированный индекс превышает Максимальная длина ключа MySQL составляет 1000 байт.
Вопрос заключается в том, есть ли способ заставить Hibernate генерировать первичный ключ, учитывая CompositeKey, а не объект @ManyToOne Student, или есть ли какой-либо способ установить студента атрибут в этой части:
Код: Выделить всё
@ManyToOne
@MapsId("studentId")
@JoinColumn(name = "student_id", insertable = false, updatable = false)
private Student student;
Подробнее здесь: https://stackoverflow.com/questions/792 ... h-in-mysql