У меня есть две таблицы в моей базе данных: регистрация и шаблоны. Существует отношение один ко многим от регистрации до шаблонов через идентификатор таблицы регистрации. Вот мои таблицы:
Регистрация. java
@Entity
@Table(name = "enrollment")
@XmlRootElement
public class Enrollment implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue
@Column(name = "id")
private Integer ID;
// other columns ...
@OneToMany(mappedBy = "enrollment")
private Set<Templates> templates;
// getters, setters, etc.
}
Шаблоны. java
@Entity
@Table(name = "templates")
@XmlRootElement
public class Templates implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue
@Column(name = "ID")
private Integer ID;
// other columns ...
@ManyToOne
@JoinColumn(name = "enrollment_id", nullable = false)
private Enrollment enrollment;
// getters, setters, etc.
}
Вот как я получаю свой список Enrollments
:
JpaRepository. java
@Override
public List<Enrollment> findEnrollments() {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Enrollment> enrollmentQuery = criteriaBuilder.createQuery(Enrollment.class);
Root<Enrollment> enrollmentRoot = enrollmentQuery.from(Enrollment.class);
Join<Enrollment, Templates> etJoin = enrollmentRoot.join(Enrollment_.templates, JoinType.LEFT);
enrollmentQuery.select(enrollmentRoot).where(enrollmentRoot.get(Enrollment_.templates).isNotNull());
List<Enrollment> listOfEnrollments = entityManager.createQuery(enrollmentQuery).getResultList();
return listOfEnrollments;
}
Я пытался следовать примеру здесь , но я продолжаю получать ошибки
Exception Description: Object comparisons can only be used with OneToOneMappings. Other mapping comparisons must be done through query keys or direct attribute level comparisons.
в этой строке:
List<Enrollment> listOfEnrollments = entityManager.createQuery(enrollmentQuery).getResultList();
всякий раз, когда я пытаюсь получить все свои регистрации из базы данных.
Кроме того, когда я пытаюсь сохранить Templates
, я получаю эту ошибку:
[EL Fine]: sql: 2020-02-14 14:03:29.023--ClientSession(308207273)--Connection(630218544)--Thread(Thread[JavaFX Application Thread,5,main])--UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [50, SEQ_GEN]
[EL Fine]: sql: 2020-02-14 14:03:29.078--ClientSession(308207273)--Connection(630218544)--Thread(Thread[JavaFX Application Thread,5,main])--SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
bind => [SEQ_GEN]
[EL Fine]: sql: 2020-02-14 14:03:29.146--ClientSession(308207273)--Connection(630218544)--Thread(Thread[JavaFX Application Thread,5,main])--INSERT INTO templates (ID, template_bytes, enrollment_id) VALUES (?, ?, ?)
bind => [451, [B@3af691d4, 127]
[EL Fine]: sql: 2020-02-14 14:03:29.175--ClientSession(308207273)--Thread(Thread[JavaFX Application Thread,5,main])--SELECT 1
[EL Warning]: 2020-02-14 14:03:29.177--UnitOfWork(1188827788)--Thread(Thread[JavaFX Application Thread,5,main])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '451' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO templates (ID, template_bytes, enrollment_id) VALUES (?, ?, ?)
bind => [451, [B@3af691d4, 127]
Это для некоторых причина, выбор, извлечение, любой неправильный следующий идентификатор из MySQL при попытке вставить, потому что # 451 - это существующий идентификатор.