Skip to content

HHH-19329 Test reproducer #499

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
}
}
49 changes: 49 additions & 0 deletions orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Artifact.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<ControlValidation> 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<ControlValidation> getDetectedControls() {
return detectedControls;
}

public void setDetectedControls(Set<ControlValidation> detectedControls) {
this.detectedControls = detectedControls;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Attestation> attestations = new HashSet<>();

public Set<Attestation> getAttestations() {
return attestations;
}

public void setAttestations(Set<Attestation> attestations) {
this.attestations = attestations;
}
}
34 changes: 34 additions & 0 deletions orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/Control.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Control> controls = new HashSet<>();

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public Set<Control> getControls() {
return controls;
}

public void setControls(Set<Control> controls) {
this.controls = controls;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.hibernate.bugs;

import jakarta.persistence.*;

@Entity
@DiscriminatorValue("1")
public class FileArtifact extends AbstractFileArtifact {
public FileArtifact() {
}
}
Original file line number Diff line number Diff line change
@@ -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.
*/
Expand All @@ -17,7 +14,7 @@ class JPAUnitTestCase {

@BeforeEach
void init() {
entityManagerFactory = Persistence.createEntityManagerFactory( "templatePU" );
entityManagerFactory = Persistence.createEntityManagerFactory("templatePU");
}

@AfterEach
Expand All @@ -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();
}
Expand Down
Loading