Несоответствие размера первичного ключа и внешнего ключа Hibernate в MySQLJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Несоответствие размера первичного ключа и внешнего ключа Hibernate в MySQL

Сообщение Anonymous »

Я работаю над проектом, в котором мне нужно установить составной первичный ключ для объекта сеанса с использованием Hibernate и MySQL. Однако, когда я определяю сущность сеанса следующим образом, Hibernate генерирует таблицу со Student_id как VARCHAR(255) вместо ожидаемого VARCHAR(36) для UUID, что вызывает следующую ошибку во время генерации схемы:

Код: Выделить всё

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;
}
А вот CompositeKey:

Код: Выделить всё

@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;
длиной 36 вместо 255.

Подробнее здесь: https://stackoverflow.com/questions/792 ... h-in-mysql
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»