diff --git a/api/src/main/java/org/openmrs/Concept.java b/api/src/main/java/org/openmrs/Concept.java index 9c1ed73b456c..39608547204b 100644 --- a/api/src/main/java/org/openmrs/Concept.java +++ b/api/src/main/java/org/openmrs/Concept.java @@ -46,6 +46,24 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.ObjectUtils; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; +import javax.persistence.Table; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Parameter; /** * A Concept object can represent either a question or an answer to a data point. That data point is @@ -70,6 +88,10 @@ * @see ConceptService */ @FullTextFilterDefs( { @FullTextFilterDef(name = "termsFilterFactory", impl = TermsFilterFactory.class) }) +@Entity +@Table(name = "concept") +@BatchSize(size = 25) +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @Audited public class Concept extends BaseOpenmrsObject implements Auditable, Retireable, Serializable, Attributable,Customizable { @@ -80,47 +102,95 @@ public class Concept extends BaseOpenmrsObject implements Auditable, Retireable, // Fields @DocumentId + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "concept_id_seq") + @GenericGenerator( + name = "concept_id_seq", + strategy = "native", + parameters = @Parameter(name = "sequence", value = "concept_concept_id_seq") + ) + @Column(name = "concept_id", nullable = false) private Integer conceptId; @Field + @Column(name = "retired", length = 1, nullable = false) private Boolean retired = false; + @ManyToOne + @JoinColumn(name = "retired_by") private User retiredBy; + @Column(name = "date_retired", length = 19) private Date dateRetired; + @Column(name = "retire_reason", length = 255) private String retireReason; @IndexedEmbedded(includeEmbeddedObjectId = true) + @ManyToOne + @JoinColumn(name = "datatype_id", nullable = false) private ConceptDatatype datatype; @IndexedEmbedded(includeEmbeddedObjectId = true) + @ManyToOne + @JoinColumn(name = "class_id", nullable = false) private ConceptClass conceptClass; + @Column(name = "is_set", length = 1, nullable = false) private Boolean set = false; + @Column(name = "version", length = 50) private String version; + @ManyToOne + @JoinColumn(name = "creator", nullable = false) private User creator; + @Column(name = "date_created", length = 19, nullable = false) private Date dateCreated; + @ManyToOne + @JoinColumn(name = "changed_by") private User changedBy; + @Column(name = "date_changed", length = 19) private Date dateChanged; @AllowDirectAccess @ContainedIn + @OneToMany(mappedBy = "concept", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @BatchSize(size = 25) private Collection names; @AllowDirectAccess + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @JoinTable( + name = "concept_answer", + joinColumns = @JoinColumn(name = "concept_id", nullable = false), + inverseJoinColumns = @JoinColumn(name = "concept_answer_id", nullable = false) + ) + @BatchSize(size = 25) + @OrderBy(value = "sort_weight ASC, concept_answer_id ASC") private Collection answers; + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @JoinTable( + name = "concept_set", + joinColumns = @JoinColumn(name = "concept_set", nullable = false), + inverseJoinColumns = @JoinColumn(name = "concept_id", nullable = false) + ) + @BatchSize(size = 25) + @OrderBy(value = "sort_weight ASC") private Collection conceptSets; + @OneToMany(mappedBy = "concept", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @BatchSize(size = 25) + @OrderBy(value = "concept_description_id") private Collection descriptions; @IndexedEmbedded(includeEmbeddedObjectId = true) + @OneToMany(mappedBy = "concept", cascade = CascadeType.ALL, orphanRemoval = true) + @BatchSize(size = 25) private Collection conceptMappings; /** @@ -129,6 +199,9 @@ public class Concept extends BaseOpenmrsObject implements Auditable, Retireable, */ private Map> compatibleCache; + @OneToMany(mappedBy = "concept", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @BatchSize(size = 100) + @OrderBy("voided ASC") private Set attributes = new LinkedHashSet<>(); /** default constructor */ diff --git a/api/src/main/resources/hibernate.cfg.xml b/api/src/main/resources/hibernate.cfg.xml index 2bd3c6ad8dc1..6a870faefef3 100644 --- a/api/src/main/resources/hibernate.cfg.xml +++ b/api/src/main/resources/hibernate.cfg.xml @@ -23,7 +23,6 @@ - diff --git a/api/src/main/resources/org/openmrs/api/db/hibernate/Concept.hbm.xml b/api/src/main/resources/org/openmrs/api/db/hibernate/Concept.hbm.xml deleted file mode 100644 index de92ea7a6f11..000000000000 --- a/api/src/main/resources/org/openmrs/api/db/hibernate/Concept.hbm.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - concept_concept_id_seq - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/api/src/test/java/org/openmrs/api/OrderServiceTest.java b/api/src/test/java/org/openmrs/api/OrderServiceTest.java index 6d553c038256..dd9999cf664b 100644 --- a/api/src/test/java/org/openmrs/api/OrderServiceTest.java +++ b/api/src/test/java/org/openmrs/api/OrderServiceTest.java @@ -2740,6 +2740,7 @@ public void saveOrder_shouldFailIfTheJavaTypeOfThePreviousOrderDoesNotMatch() th .addAnnotatedClass(ProgramAttributeType.class) .addAnnotatedClass(HL7InError.class) .addAnnotatedClass(OrderType.class) + .addAnnotatedClass(Concept.class) .getMetadataBuilder().build();