diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/AbstractFileArtifact.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/AbstractFileArtifact.java new file mode 100644 index 00000000..c6489936 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/AbstractFileArtifact.java @@ -0,0 +1,20 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; + +@Entity +public abstract class AbstractFileArtifact extends Artifact { + public AbstractFileArtifact() { + } + + @Column(name = "file_hash", nullable = false) + protected String fileHash; + + public String getFileHash() { + return fileHash; + } + + public void setFileHash(String fileHash) { + this.fileHash = fileHash; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Artifact.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Artifact.java new file mode 100644 index 00000000..309af719 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Artifact.java @@ -0,0 +1,49 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.io.Serializable; + +@Entity +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name = "artifact_type", discriminatorType = DiscriminatorType.INTEGER) +@Table(name = "artifact") +public abstract class Artifact implements Serializable { + + public Artifact() { + } + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + protected Long id; + + @Column(name = "description") + protected String description; + + @OneToOne(mappedBy = "artifact", cascade = CascadeType.ALL) + ArtifactValidation validation = null; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public ArtifactValidation getValidation() { + return validation; + } + + public void setValidation(ArtifactValidation validation) { + this.validation = validation; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ArtifactValidation.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ArtifactValidation.java new file mode 100644 index 00000000..bea8bb03 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ArtifactValidation.java @@ -0,0 +1,60 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "artifact_validation") +public class ArtifactValidation implements Serializable { + public ArtifactValidation() { + } + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + private Long id; + + @Column(name = "validation_message", columnDefinition = "text") + private String validationMessage; + + @OneToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "artifact_id", updatable = false) + private Artifact artifact; + + @OneToMany(mappedBy = "artifactValidation", cascade = CascadeType.ALL) + private Set detectedControls = new HashSet<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getValidationMessage() { + return validationMessage; + } + + public void setValidationMessage(String validationMessage) { + this.validationMessage = validationMessage; + } + + public Artifact getArtifact() { + return artifact; + } + + public void setArtifact(Artifact artifact) { + this.artifact = artifact; + } + + public Set getDetectedControls() { + return detectedControls; + } + + public void setDetectedControls(Set detectedControls) { + this.detectedControls = detectedControls; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Attestation.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Attestation.java new file mode 100644 index 00000000..ccbd7484 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Attestation.java @@ -0,0 +1,37 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.io.Serializable; +import java.util.UUID; + +@Entity +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER, columnDefinition = "int(2)") +@DiscriminatorValue("1") +public class Attestation implements Serializable { + public Attestation() { + } + + @Id + protected UUID id = UUID.randomUUID(); + + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "attestation_artifact_id", updatable = false) + protected AttestationArtifact artifact; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public AttestationArtifact getArtifact() { + return artifact; + } + + public void setArtifact(AttestationArtifact artifact) { + this.artifact = artifact; + } +} diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/AttestationArtifact.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/AttestationArtifact.java new file mode 100644 index 00000000..2dfade01 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/AttestationArtifact.java @@ -0,0 +1,24 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +@DiscriminatorValue("5") +public class AttestationArtifact extends Artifact { + + public AttestationArtifact() { + } + + @OneToMany(mappedBy = "artifact", cascade = CascadeType.ALL) + private Set attestations = new HashSet<>(); + + public Set getAttestations() { + return attestations; + } + + public void setAttestations(Set attestations) { + this.attestations = attestations; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Control.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Control.java new file mode 100644 index 00000000..83d5ba92 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Control.java @@ -0,0 +1,34 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.io.Serializable; + +@Entity +@Table(name = "control") +public class Control implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + private Long id; + + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(updatable = false, name = "control_domain_id") + private ControlDomain controlDomain; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public ControlDomain getControlDomain() { + return controlDomain; + } + + public void setControlDomain(ControlDomain controlDomain) { + this.controlDomain = controlDomain; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ControlDomain.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ControlDomain.java new file mode 100644 index 00000000..7a45d496 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ControlDomain.java @@ -0,0 +1,35 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "control_domain") +public class ControlDomain implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + private Long id; + + @OneToMany(mappedBy = "controlDomain") + private Set controls = new HashSet<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Set getControls() { + return controls; + } + + public void setControls(Set controls) { + this.controls = controls; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ControlValidation.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ControlValidation.java new file mode 100644 index 00000000..ae3fe65d --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ControlValidation.java @@ -0,0 +1,59 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.io.Serializable; + +@Entity +@Table(name = "control_validation") +public class ControlValidation implements Serializable { + public ControlValidation() { + } + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "control_domain_id") + ControlDomain controlDomain; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "control_id") + Control control = null; + + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(updatable = false, name = "artifact_validation_id") + ArtifactValidation artifactValidation; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public ControlDomain getControlDomain() { + return controlDomain; + } + + public void setControlDomain(ControlDomain controlDomain) { + this.controlDomain = controlDomain; + } + + public Control getControl() { + return control; + } + + public void setControl(Control control) { + this.control = control; + } + + public ArtifactValidation getArtifactValidation() { + return artifactValidation; + } + + public void setArtifactValidation(ArtifactValidation artifactValidation) { + this.artifactValidation = artifactValidation; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/FileArtifact.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/FileArtifact.java new file mode 100644 index 00000000..eb5d8fa8 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/FileArtifact.java @@ -0,0 +1,10 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; + +@Entity +@DiscriminatorValue("1") +public class FileArtifact extends AbstractFileArtifact { + public FileArtifact() { + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/JPAUnitTestCase.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/JPAUnitTestCase.java index 3734df49..772dd99a 100644 --- a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/JPAUnitTestCase.java +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/JPAUnitTestCase.java @@ -1,13 +1,10 @@ package org.hibernate.bugs; +import jakarta.persistence.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityManagerFactory; -import jakarta.persistence.Persistence; - /** * This template demonstrates how to develop a test case for Hibernate ORM, using the Java Persistence API. */ @@ -17,7 +14,7 @@ class JPAUnitTestCase { @BeforeEach void init() { - entityManagerFactory = Persistence.createEntityManagerFactory( "templatePU" ); + entityManagerFactory = Persistence.createEntityManagerFactory("templatePU"); } @AfterEach @@ -28,10 +25,28 @@ void destroy() { // Entities are auto-discovered, so just add them anywhere on class-path // Add your tests, using standard JUnit. @Test - void hhh123Test() throws Exception { + void hhh19329Test() throws Exception { EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); // Do stuff... + entityManager.createQuery("SELECT correlated_validation_detectedControls.id AS ControlValidationView_id,\n" + + " correlated_validation_detectedControls.controlDomain.id AS ControlValidationView_controlDomainId,\n" + + " correlated_validation_detectedControls.control.id AS ControlValidationView_controlId,\n" + + " correlated_validation_detectedControls.id AS ControlValidationView_validationDetections,\n" + + " NULLFN(),\n" + + " validation_1.id\n" + + "FROM Artifact artifact\n" + + " LEFT JOIN artifact.answers answers_1\n" + + " LEFT JOIN answers_1.question question_1\n" + + " LEFT JOIN artifact.attestations attestations_1\n" + + " LEFT JOIN attestations_1.referencedArtifact referencedArtifact_1\n" + + " LEFT JOIN referencedArtifact_1.validation validation_17\n" + + " LEFT JOIN artifact.validation validation_1\n" + + " JOIN ControlValidation correlated_validation_detectedControls ON (EXISTS (SELECT 1\n" + + " FROM correlated_validation_detectedControls.artifactValidation _synth_subquery_0,\n" + + " validation_1.artifact artifact_6\n" + + " WHERE _synth_subquery_0.artifact = artifact_6))\n" + + "WHERE artifact.id = :param_0").setParameter("param_0", 1L).getSingleResult(); entityManager.getTransaction().commit(); entityManager.close(); } diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/MissingArtifactAttestation.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/MissingArtifactAttestation.java new file mode 100644 index 00000000..69b82c76 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/MissingArtifactAttestation.java @@ -0,0 +1,18 @@ +package org.hibernate.bugs; + + +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; + +import java.util.Set; + +@Entity +@DiscriminatorValue("2") +public class MissingArtifactAttestation extends Attestation { + + @ManyToOne + @JoinColumn(name = "referenced_artifact_id") + private Artifact referencedArtifact; +} diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireAnswer.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireAnswer.java new file mode 100644 index 00000000..4e9c5086 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireAnswer.java @@ -0,0 +1,59 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.io.Serializable; +import java.util.UUID; + +@Entity +@Table(name = "questionnaire_answers") +public class QuestionnaireAnswer implements Serializable { + + public QuestionnaireAnswer() { + } + + @Id + private UUID id = UUID.randomUUID(); + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "artifact_id", updatable = false) + private QuestionnaireArtifact artifact; + + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @JoinColumn(name = "question_id") + private QuestionnaireQuestion question; + + @Column(name = "answer") + private String answer; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public QuestionnaireArtifact getArtifact() { + return artifact; + } + + public void setArtifact(QuestionnaireArtifact artifact) { + this.artifact = artifact; + } + + public QuestionnaireQuestion getQuestion() { + return question; + } + + public void setQuestion(QuestionnaireQuestion question) { + this.question = question; + } + + public String getAnswer() { + return answer; + } + + public void setAnswer(String answer) { + this.answer = answer; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireArtifact.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireArtifact.java new file mode 100644 index 00000000..b5af763b --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireArtifact.java @@ -0,0 +1,25 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@DiscriminatorValue("2") +public class QuestionnaireArtifact extends Artifact { + + public QuestionnaireArtifact() { + } + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "artifact") + @OrderColumn(name = "question_order", nullable = false) + private List answers = new ArrayList<>(); + + public List getAnswers() { + return answers; + } + + public void setAnswers(List answers) { + this.answers = answers; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireQuestion.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireQuestion.java new file mode 100644 index 00000000..ec558868 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/QuestionnaireQuestion.java @@ -0,0 +1,47 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; + +@Entity +@Table(name = "questionnaire_questions") +public class QuestionnaireQuestion { + + public QuestionnaireQuestion() { + } + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + private Long id; + + @Column(name = "question", columnDefinition = "text", nullable = false) + private String question; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "owning_artifact_id") + private QuestionnaireArtifact owningArtifact; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + public QuestionnaireArtifact getOwningArtifact() { + return owningArtifact; + } + + public void setOwningArtifact(QuestionnaireArtifact owningArtifact) { + this.owningArtifact = owningArtifact; + } +} \ No newline at end of file diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/UrlArtifact.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/UrlArtifact.java new file mode 100644 index 00000000..27d28a5f --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/UrlArtifact.java @@ -0,0 +1,22 @@ +package org.hibernate.bugs; + +import jakarta.persistence.*; + +@Entity +@DiscriminatorValue("4") +public class UrlArtifact extends AbstractFileArtifact { + + public UrlArtifact() { + } + + @Column(name = "url", nullable = false) + private String url; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} \ No newline at end of file