diff --git a/openjpa-all/src/main/appended-resources/META-INF/LICENSE.vm b/openjpa-all/src/main/appended-resources/META-INF/LICENSE.vm index e397ee2e0..88b1a5d0d 100644 --- a/openjpa-all/src/main/appended-resources/META-INF/LICENSE.vm +++ b/openjpa-all/src/main/appended-resources/META-INF/LICENSE.vm @@ -244,6 +244,8 @@ openjpa-persistence - http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd) orm_3_0-xsd.rsrc - Eclipse Public License v2.0 - included in the openjpa jar, taken from: https://jakarta.ee/xml/ns/persistence/orm/orm_3_0.xsd + orm_3_1-xsd.rsrc - Eclipse Public License v2.0 - included in the openjpa jar, taken from: + https://jakarta.ee/xml/ns/persistence/orm/orm_3_1.xsd persistence-xsd.rsrc - CDDL 1.0 - included in the openjpa jar, taken from: http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd) persistence_2_0-xsd.rsrc - CDDL 1.0 - included in the openjpa jar, taken from: diff --git a/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLVersionParser.java b/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLVersionParser.java index e9d3cbff7..6fbfd8588 100644 --- a/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLVersionParser.java +++ b/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLVersionParser.java @@ -34,6 +34,7 @@ public class XMLVersionParser extends XMLMetaDataParser { public static final String VERSION_2_1 = "2.1"; public static final String VERSION_2_2 = "2.2"; public static final String VERSION_3_0 = "3.0"; + public static final String VERSION_3_1 = "3.1"; static private final String VERSION_ATTR = "version"; static private final String XSI_NS = diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java index a22fec797..1f77be4f4 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java @@ -41,7 +41,8 @@ public class TestJava8TimeTypes extends SingleEMFTestCase { private static String VAL_LOCAL_TIME = "04:57:15"; private static String VAL_LOCAL_DATETIME = "2019-01-01T01:00:00"; - private Java8TimeTypes insertedEntity = new Java8TimeTypes(); + private Java8TimeTypes entity1 = new Java8TimeTypes(); + private Java8TimeTypes entity2 = new Java8TimeTypes(); @Override public void setUp() { @@ -49,16 +50,28 @@ public void setUp() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); - - insertedEntity.setId(1); - insertedEntity.setOldDateField(new Date()); - insertedEntity.setLocalTimeField(LocalTime.parse(VAL_LOCAL_TIME)); - insertedEntity.setLocalDateField(LocalDate.parse(VAL_LOCAL_DATE)); - insertedEntity.setLocalDateTimeField(LocalDateTime.parse(VAL_LOCAL_DATETIME)); - insertedEntity.setOffsetTimeField(insertedEntity.getLocalTimeField().atOffset(ZoneOffset.ofHours(-9))); - insertedEntity.setOffsetDateTimeField(insertedEntity.getLocalDateTimeField().atOffset(ZoneOffset.ofHours(-9))); - - em.persist(insertedEntity); + + entity1.setId(1); + entity1.setOldDateField(new Date()); + entity1.setLocalTimeField(LocalTime.parse(VAL_LOCAL_TIME)); + entity1.setLocalDateField(LocalDate.parse(VAL_LOCAL_DATE)); + entity1.setLocalDateTimeField(LocalDateTime.parse(VAL_LOCAL_DATETIME)); + entity1.setOffsetTimeField(entity1.getLocalTimeField().atOffset(ZoneOffset.ofHours(-9))); + entity1.setOffsetDateTimeField(entity1.getLocalDateTimeField().atOffset(ZoneOffset.ofHours(-9))); + + em.persist(entity1); + + // Second entity is created to pass testGetCurrentLocalTime test + // it still can fail in case will be started exactly at midnight + entity2.setId(2); + entity2.setOldDateField(new Date()); + entity2.setLocalTimeField(LocalTime.now().minusNanos(1)); + entity2.setLocalDateField(LocalDate.parse(VAL_LOCAL_DATE)); + entity2.setLocalDateTimeField(LocalDateTime.parse(VAL_LOCAL_DATETIME)); + entity2.setOffsetTimeField(entity2.getLocalTimeField().atOffset(ZoneOffset.ofHours(-9))); + entity2.setOffsetDateTimeField(entity2.getLocalDateTimeField().atOffset(ZoneOffset.ofHours(-9))); + + em.persist(entity2); em.getTransaction().commit(); em.close(); @@ -77,20 +90,20 @@ public void testReadJava8Types() { // Many databases do not support WITH TIMEZONE syntax. // Thus we can only portably ensure tha the same instant is used at least. - assertEquals(Instant.from(insertedEntity.getOffsetDateTimeField()), + assertEquals(Instant.from(entity1.getOffsetDateTimeField()), Instant.from(eRead.getOffsetDateTimeField())); - assertEquals(insertedEntity.getOffsetTimeField().withOffsetSameInstant(eRead.getOffsetTimeField().getOffset()), + assertEquals(entity1.getOffsetTimeField().withOffsetSameInstant(eRead.getOffsetTimeField().getOffset()), eRead.getOffsetTimeField()); em.close(); } - - // we've got reports from various functions not properly working with Java8 Dates. + + // we've got reports from various functions not properly working with Java8 Dates. public void testReadLocalDate() { EntityManager em = emf.createEntityManager(); final TypedQuery qry = em.createQuery("select t.localDateField from Java8TimeTypes AS t", LocalDate.class); - final LocalDate date = qry.getSingleResult(); - assertNotNull(date); + final List date = qry.getResultList(); + assertEquals(2, date.size()); em.close(); } @@ -115,7 +128,9 @@ public void testMaxLocalTime() { EntityManager em = emf.createEntityManager(); final TypedQuery qry = em.createQuery("select max(t.localTimeField) from Java8TimeTypes AS t", LocalTime.class); final LocalTime max = qry.getSingleResult(); - assertEquals(LocalTime.parse(VAL_LOCAL_TIME), max); + final LocalTime etalon = (entity1.getLocalTimeField().compareTo(entity2.getLocalTimeField()) > 0 + ? entity1.getLocalTimeField() : entity2.getLocalTimeField()).withNano(0); + assertEquals(etalon, max); em.close(); } @@ -123,8 +138,17 @@ public void testMaxOffsetTime() { EntityManager em = emf.createEntityManager(); final TypedQuery qry = em.createQuery("select max(t.offsetTimeField) from Java8TimeTypes AS t", OffsetTime.class); final OffsetTime max = qry.getSingleResult(); - assertEquals(insertedEntity.getOffsetTimeField().withOffsetSameInstant(insertedEntity.getOffsetTimeField().getOffset()), - max.withOffsetSameInstant(insertedEntity.getOffsetTimeField().getOffset())); + + // ---from DBDictionary + // adjust to the default timezone right now. + // This is an ugly hack and cries for troubles in case the daylight saving changes... + // Which is also the reason why we cannot cache the offset. + // According to the Oracle docs the JDBC driver always assumes 'local time' ... + final ZoneOffset zoneOffset = OffsetDateTime.now().getOffset(); + final OffsetTime offset1 = entity1.getOffsetTimeField().withOffsetSameInstant(zoneOffset); + final OffsetTime offset2 = entity2.getOffsetTimeField().withOffsetSameInstant(zoneOffset); + final OffsetTime etalon = (offset1.compareTo(offset2) > 0) ? offset1 : offset2; + assertEquals(etalon.withNano(0), max); em.close(); } @@ -132,7 +156,7 @@ public void testMaxOffsetDateTime() { EntityManager em = emf.createEntityManager(); final TypedQuery qry = em.createQuery("select max(t.offsetDateTimeField) from Java8TimeTypes AS t", OffsetDateTime.class); final OffsetDateTime max = qry.getSingleResult(); - assertEquals(Instant.from(insertedEntity.getOffsetDateTimeField()), + assertEquals(Instant.from(entity1.getOffsetDateTimeField()), Instant.from(max)); em.close(); } @@ -157,7 +181,9 @@ public void testMinLocalTime() { EntityManager em = emf.createEntityManager(); final TypedQuery qry = em.createQuery("select min(t.localTimeField) from Java8TimeTypes AS t", LocalTime.class); final LocalTime min = qry.getSingleResult(); - assertEquals(LocalTime.parse(VAL_LOCAL_TIME), min); + final LocalTime etalon = (entity1.getLocalTimeField().compareTo(entity2.getLocalTimeField()) < 0 + ? entity1.getLocalTimeField() : entity2.getLocalTimeField()).withNano(0); + assertEquals(etalon, min); em.close(); } @@ -165,8 +191,17 @@ public void testMinOffsetTime() { EntityManager em = emf.createEntityManager(); final TypedQuery qry = em.createQuery("select min(t.offsetTimeField) from Java8TimeTypes AS t", OffsetTime.class); final OffsetTime min = qry.getSingleResult(); - assertEquals(insertedEntity.getOffsetTimeField().withOffsetSameInstant(insertedEntity.getOffsetTimeField().getOffset()), - min.withOffsetSameInstant(insertedEntity.getOffsetTimeField().getOffset())); + + // ---from DBDictionary + // adjust to the default timezone right now. + // This is an ugly hack and cries for troubles in case the daylight saving changes... + // Which is also the reason why we cannot cache the offset. + // According to the Oracle docs the JDBC driver always assumes 'local time' ... + final ZoneOffset zoneOffset = OffsetDateTime.now().getOffset(); + final OffsetTime offset1 = entity1.getOffsetTimeField().withOffsetSameInstant(zoneOffset); + final OffsetTime offset2 = entity2.getOffsetTimeField().withOffsetSameInstant(zoneOffset); + final OffsetTime etalon = (offset1.compareTo(offset2) < 0) ? offset1 : offset2; + assertEquals(etalon.withNano(0), min); em.close(); } @@ -175,7 +210,7 @@ public void testMinOffsetDateTime() { final TypedQuery qry = em.createQuery("select min(t.offsetDateTimeField) from Java8TimeTypes AS t", OffsetDateTime.class); final OffsetDateTime min = qry.getSingleResult(); - assertEquals(Instant.from(insertedEntity.getOffsetDateTimeField()), + assertEquals(Instant.from(entity1.getOffsetDateTimeField()), Instant.from(min)); em.close(); } @@ -186,16 +221,17 @@ public void testCurrentDateLocalDate() { = em.createQuery("select j from Java8TimeTypes AS j where j.localDateField < CURRENT_DATE", Java8TimeTypes.class); final List times = qry.getResultList(); assertNotNull(times); - assertTrue(!times.isEmpty()); + assertFalse(times.isEmpty()); em.close(); } + public void testCurrentDateLocalDateTime() { EntityManager em = emf.createEntityManager(); final TypedQuery qry = em.createQuery("select j from Java8TimeTypes AS j where j.localDateTimeField < CURRENT_TIMESTAMP", Java8TimeTypes.class); final List times = qry.getResultList(); assertNotNull(times); - assertTrue(!times.isEmpty()); + assertFalse(times.isEmpty()); em.close(); } @@ -205,17 +241,17 @@ public void testGetCurrentLocalDate() { = em.createQuery("select j from Java8TimeTypes AS j where j.localDateField < LOCAL DATE", Java8TimeTypes.class); final List times = qry.getResultList(); assertNotNull(times); - assertTrue(!times.isEmpty()); + assertFalse(times.isEmpty()); em.close(); } public void testGetCurrentLocalDateTime() { EntityManager em = emf.createEntityManager(); final TypedQuery qry - = em.createQuery("select j from Java8TimeTypes AS j where j.localDateTimeField < LOCAL DATETIME", Java8TimeTypes.class); + = em.createQuery("select j from Java8TimeTypes AS j where j.localDateTimeField < LOCAL DATETIME", Java8TimeTypes.class); final List times = qry.getResultList(); assertNotNull(times); - assertTrue(!times.isEmpty()); + assertFalse(times.isEmpty()); em.close(); } @@ -225,7 +261,7 @@ public void testGetCurrentLocalTime() { = em.createQuery("select j from Java8TimeTypes AS j where j.localTimeField < LOCAL TIME", Java8TimeTypes.class); final List times = qry.getResultList(); assertNotNull(times); - assertTrue(!times.isEmpty()); + assertFalse(times.isEmpty()); em.close(); } diff --git a/openjpa-persistence/src/main/appended-resources/META-INF/LICENSE.vm b/openjpa-persistence/src/main/appended-resources/META-INF/LICENSE.vm index bd3f7cfc5..7ab3c1559 100644 --- a/openjpa-persistence/src/main/appended-resources/META-INF/LICENSE.vm +++ b/openjpa-persistence/src/main/appended-resources/META-INF/LICENSE.vm @@ -42,6 +42,8 @@ openjpa-persistence - http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd) orm_3_0-xsd.rsrc - Eclipse Public License v2.0 - included in the openjpa jar, taken from: https://jakarta.ee/xml/ns/persistence/orm/orm_3_0.xsd + orm_3_1-xsd.rsrc - Eclipse Public License v2.0 - included in the openjpa jar, taken from: + https://jakarta.ee/xml/ns/persistence/orm/orm_3_1.xsd persistence-xsd.rsrc - CDDL 1.0 - included in the openjpa jar, taken from: http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd) persistence_2_0-xsd.rsrc - CDDL 1.0 - included in the openjpa jar, taken from: diff --git a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java index bb43046e1..7c0eddeb9 100644 --- a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java +++ b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java @@ -594,6 +594,11 @@ protected Object getSchemaSource() { } else if (XMLVersionParser.VERSION_3_0.equals(_ormVersion) || (_schemaLocation != null && _schemaLocation.indexOf(ORM_XSD_3_0) > -1)) { ormxsd = "orm_3_0-xsd.rsrc"; + useExtendedSchema = false; + } else if (XMLVersionParser.VERSION_3_1.equals(_ormVersion) + || (_schemaLocation != null && _schemaLocation.indexOf(ORM_XSD_3_0) > -1)) { + ormxsd = "orm_3_1-xsd.rsrc"; + useExtendedSchema = false; } List schema = new ArrayList<>(); diff --git a/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/orm_3_1.xsd b/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/orm_3_1.xsd new file mode 100644 index 000000000..f233261ef --- /dev/null +++ b/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/orm_3_1.xsd @@ -0,0 +1,2325 @@ + + + + + + + + + ... + + + + ]]> + + + + + + + + + + + + + + + + + + The entity-mappings element is the root element of a mapping + file. It contains the following four types of elements: + + 1. The persistence-unit-metadata element contains metadata + for the entire persistence unit. It is undefined if this element + occurs in multiple mapping files within the same persistence unit. + + 2. The package, schema, catalog and access elements apply to all of + the entity, mapped-superclass and embeddable elements defined in + the same file in which they occur. + + 3. The sequence-generator, table-generator, converter, named-query, + named-native-query, named-stored-procedure-query, and + sql-result-set-mapping elements are global to the persistence + unit. It is undefined to have more than one sequence-generator + or table-generator of the same name in the same or different + mapping files in a persistence unit. It is undefined to have + more than one named-query, named-native-query, sql-result-set-mapping, + or named-stored-procedure-query of the same name in the same + or different mapping files in a persistence unit. It is also + undefined to have more than one converter for the same target + type in the same or different mapping files in a persistence unit. + + 4. The entity, mapped-superclass and embeddable elements each define + the mapping information for a managed persistent class. The mapping + information contained in these elements may be complete or it may + be partial. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Metadata that applies to the persistence unit and not just to + the mapping file in which it is contained. + + If the xml-mapping-metadata-complete element is specified, + the complete set of mapping metadata for the persistence unit + is contained in the XML mapping files for the persistence unit. + + + + + + + + + + + + + + + + + These defaults are applied to the persistence unit as a whole + unless they are overridden by local annotation or XML + element settings. + + schema - Used as the schema for all tables, secondary tables, join + tables, collection tables, sequence generators, and table + generators that apply to the persistence unit + catalog - Used as the catalog for all tables, secondary tables, join + tables, collection tables, sequence generators, and table + generators that apply to the persistence unit + delimited-identifiers - Used to treat database identifiers as + delimited identifiers. + access - Used as the access type for all managed classes in + the persistence unit + cascade-persist - Adds cascade-persist to the set of cascade options + in all entity relationships of the persistence unit + entity-listeners - List of default entity listeners to be invoked + on each entity in the persistence unit. + + + + + + + + + + + + + + + + + + + + Defines the settings and mappings for an entity. Is allowed to be + sparsely populated and used in conjunction with the annotations. + Alternatively, the metadata-complete attribute can be used to + indicate that no annotations on the entity class (and its fields + or properties) are to be processed. If this is the case then + the defaulting rules for the entity and its subelements will + be recursively applied. + + @Target(TYPE) @Retention(RUNTIME) + public @interface Entity { + String name() default ""; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This element determines how the persistence provider accesses the + state of an entity or embedded object. + + + + + + + + + + + + + + + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface AssociationOverride { + String name(); + JoinColumn[] joinColumns() default{}; + JoinTable joinTable() default @JoinTable; + } + + + + + + + + + + + + + + + + + + + + + + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface AttributeOverride { + String name(); + Column column(); + } + + + + + + + + + + + + + + + + + This element contains the entity field or property mappings. + It may be sparsely populated to include only a subset of the + fields or properties. If metadata-complete for the entity is true + then the remainder of the attributes will be defaulted according + to the default rules. + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Basic { + FetchType fetch() default EAGER; + boolean optional() default true; + } + + + + + + + + + + + + + + + + + + + + + + + + + public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH}; + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface CollectionTable { + String name() default ""; + String catalog() default ""; + String schema() default ""; + JoinColumn[] joinColumns() default {}; + UniqueConstraint[] uniqueConstraints() default {}; + Index[] indexes() default {}; + } + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Column { + String name() default ""; + boolean unique() default false; + boolean nullable() default true; + boolean insertable() default true; + boolean updatable() default true; + String columnDefinition() default ""; + String table() default ""; + int length() default 255; + int precision() default 0; // decimal precision + int scale() default 0; // decimal scale + } + + + + + + + + + + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface ColumnResult { + String name(); + Class type() default void.class; + } + + + + + + + + + + + + + + public enum ConstraintMode {CONSTRAINT, NO_CONSTRAINT, PROVIDER_DEFAULT}; + + + + + + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface ConstructorResult { + Class targetClass(); + ColumnResult[] columns(); + } + + + + + + + + + + + + + + + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface Convert { + Class converter() default void.class; + String attributeName() default ""; + boolean disableConversion() default false; + } + + + + + + + + + + + + + + + + + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface Converter { + boolean autoApply() default false; + } + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface DiscriminatorColumn { + String name() default "DTYPE"; + DiscriminatorType discriminatorType() default STRING; + String columnDefinition() default ""; + int length() default 31; + } + + + + + + + + + + + + + + + + public enum DiscriminatorType { STRING, CHAR, INTEGER }; + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface DiscriminatorValue { + String value(); + } + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface ElementCollection { + Class targetClass() default void.class; + FetchType fetch() default LAZY; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Defines the settings and mappings for embeddable objects. Is + allowed to be sparsely populated and used in conjunction with + the annotations. Alternatively, the metadata-complete attribute + can be used to indicate that no annotations are to be processed + in the class. If this is the case then the defaulting rules will + be recursively applied. + + @Target({TYPE}) @Retention(RUNTIME) + public @interface Embeddable {} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Embedded {} + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface EmbeddedId {} + + + + + + + + + + + + + + + + + Defines an entity listener to be invoked at lifecycle events + for the entities that list this listener. + + + + + + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface EntityListeners { + Class[] value(); + } + + + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface EntityResult { + Class entityClass(); + FieldResult[] fields() default {}; + String discriminatorColumn() default ""; + } + + + + + + + + + + + + + + + + + public enum EnumType { + ORDINAL, + STRING + } + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Enumerated { + EnumType value() default ORDINAL; + } + + + + + + + + + + + + + public enum FetchType { LAZY, EAGER }; + + + + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface FieldResult { + String name(); + String column(); + } + + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface ForeignKey { + String name() default ""; + ConstraintMode value() default CONSTRAINT; + String foreign-key-definition() default ""; + + Note that the elements that embed the use of the annotation + default this use as @ForeignKey(PROVIDER_DEFAULT). + + } + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface GeneratedValue { + GenerationType strategy() default AUTO; + String generator() default ""; + } + + + + + + + + + + + + + + public enum GenerationType { TABLE, SEQUENCE, IDENTITY, UUID, AUTO }; + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Id {} + + + + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface IdClass { + Class value(); + } + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface Index { + String name() default ""; + String columnList(); + boolean unique() default false; + } + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface Inheritance { + InheritanceType strategy() default SINGLE_TABLE; + } + + + + + + + + + + + + + public enum InheritanceType + { SINGLE_TABLE, JOINED, TABLE_PER_CLASS}; + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface JoinColumn { + String name() default ""; + String referencedColumnName() default ""; + boolean unique() default false; + boolean nullable() default true; + boolean insertable() default true; + boolean updatable() default true; + String columnDefinition() default ""; + String table() default ""; + ForeignKey foreignKey() default @ForeignKey(); + } + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface JoinTable { + String name() default ""; + String catalog() default ""; + String schema() default ""; + JoinColumn[] joinColumns() default {}; + JoinColumn[] inverseJoinColumns() default {}; + UniqueConstraint[] uniqueConstraints() default {}; + Index[] indexes() default {}; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Lob {} + + + + + + + + + + + + public enum LockModeType { READ, WRITE, OPTIMISTIC, OPTIMISTIC_FORCE_INCREMENT, PESSIMISTIC_READ, PESSIMISTIC_WRITE, PESSIMISTIC_FORCE_INCREMENT, NONE}; + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface ManyToMany { + Class targetEntity() default void.class; + CascadeType[] cascade() default {}; + FetchType fetch() default LAZY; + String mappedBy() default ""; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface ManyToOne { + Class targetEntity() default void.class; + CascadeType[] cascade() default {}; + FetchType fetch() default EAGER; + boolean optional() default true; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface MapKey { + String name() default ""; + } + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface MapKeyClass { + Class value(); + } + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface MapKeyColumn { + String name() default ""; + boolean unique() default false; + boolean nullable() default false; + boolean insertable() default true; + boolean updatable() default true; + String columnDefinition() default ""; + String table() default ""; + int length() default 255; + int precision() default 0; // decimal precision + int scale() default 0; // decimal scale + } + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface MapKeyJoinColumn { + String name() default ""; + String referencedColumnName() default ""; + boolean unique() default false; + boolean nullable() default false; + boolean insertable() default true; + boolean updatable() default true; + String columnDefinition() default ""; + String table() default ""; + } + + + + + + + + + + + + + + + + + + + + + Defines the settings and mappings for a mapped superclass. Is + allowed to be sparsely populated and used in conjunction with + the annotations. Alternatively, the metadata-complete attribute + can be used to indicate that no annotations are to be processed + If this is the case then the defaulting rules will be recursively + applied. + + @Target(TYPE) @Retention(RUNTIME) + public @interface MappedSuperclass{} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface NamedAttributeNode { + String value(); + String subgraph() default ""; + String keySubgraph() default ""; + } + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface NamedEntityGraph { + String name() default ""; + NamedAttributeNode[] attributeNodes() default {}; + boolean includeAllAttributes() default false; + NamedSubgraph[] subgraphs() default {}; + NamedSubGraph[] subclassSubgraphs() default {}; + } + + + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface NamedNativeQuery { + String name(); + String query(); + QueryHint[] hints() default {}; + Class resultClass() default void.class; + String resultSetMapping() default ""; //named SqlResultSetMapping + } + + + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface NamedQuery { + String name(); + String query(); + LockModeType lockMode() default NONE; + QueryHint[] hints() default {}; + } + + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface NamedStoredProcedureQuery { + String name(); + String procedureName(); + StoredProcedureParameter[] parameters() default {}; + Class[] resultClasses() default {}; + String[] resultSetMappings() default{}; + QueryHint[] hints() default {}; + } + + + + + + + + + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface NamedSubgraph { + String name(); + Class type() default void.class; + NamedAttributeNode[] attributeNodes(); + } + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface OneToMany { + Class targetEntity() default void.class; + CascadeType[] cascade() default {}; + FetchType fetch() default LAZY; + String mappedBy() default ""; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface OneToOne { + Class targetEntity() default void.class; + CascadeType[] cascade() default {}; + FetchType fetch() default EAGER; + boolean optional() default true; + String mappedBy() default ""; + boolean orphanRemoval() default false; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface OrderBy { + String value() default ""; + } + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface OrderColumn { + String name() default ""; + boolean nullable() default true; + boolean insertable() default true; + boolean updatable() default true; + String columnDefinition() default ""; + } + + + + + + + + + + + + + + + + + public enum ParameterMode { IN, INOUT, OUT, REF_CURSOR}; + + + + + + + + + + + + + + + + + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PostLoad {} + + + + + + + + + + + + + + + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PostPersist {} + + + + + + + + + + + + + + + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PostRemove {} + + + + + + + + + + + + + + + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PostUpdate {} + + + + + + + + + + + + + + + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PrePersist {} + + + + + + + + + + + + + + + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PreRemove {} + + + + + + + + + + + + + + + + @Target({METHOD}) @Retention(RUNTIME) + public @interface PreUpdate {} + + + + + + + + + + + + + + + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface PrimaryKeyJoinColumn { + String name() default ""; + String referencedColumnName() default ""; + String columnDefinition() default ""; + } + + + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface QueryHint { + String name(); + String value(); + } + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface SecondaryTable { + String name(); + String catalog() default ""; + String schema() default ""; + PrimaryKeyJoinColumn[] pkJoinColumns() default {}; + UniqueConstraint[] uniqueConstraints() default {}; + Index[] indexes() default {}; + } + + + + + + + + + + + + + + + + + + + + + + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface SequenceGenerator { + String name(); + String sequenceName() default ""; + String catalog() default ""; + String schema() default ""; + int initialValue() default 1; + int allocationSize() default 50; + } + + + + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface SqlResultSetMapping { + String name(); + EntityResult[] entities() default {}; + ConstructorResult[] classes() default{}; + ColumnResult[] columns() default {}; + } + + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface StoredProcedureParameter { + String name() default ""; + ParameterMode mode() default ParameterMode.IN; + Class type(); + } + + + + + + + + + + + + + + + + + + @Target({TYPE}) @Retention(RUNTIME) + public @interface Table { + String name() default ""; + String catalog() default ""; + String schema() default ""; + UniqueConstraint[] uniqueConstraints() default {}; + Index[] indexes() default {}; + } + + + + + + + + + + + + + + + + + + + @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) + public @interface TableGenerator { + String name(); + String table() default ""; + String catalog() default ""; + String schema() default ""; + String pkColumnName() default ""; + String valueColumnName() default ""; + String pkColumnValue() default ""; + int initialValue() default 0; + int allocationSize() default 50; + UniqueConstraint[] uniqueConstraints() default {}; + Indexes[] indexes() default {}; + } + + + + + + + + + + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Temporal { + TemporalType value(); + } + + + + + + + + + + + + + public enum TemporalType { + DATE, // java.sql.Date + TIME, // java.sql.Time + TIMESTAMP // java.sql.Timestamp + } + + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Transient {} + + + + + + + + + + + + + @Target({}) @Retention(RUNTIME) + public @interface UniqueConstraint { + String name() default ""; + String[] columnNames(); + } + + + + + + + + + + + + + + + + @Target({METHOD, FIELD}) @Retention(RUNTIME) + public @interface Version {} + + + + + + + + + + + + diff --git a/openjpa-project/LICENSE b/openjpa-project/LICENSE index b61bfb46c..8b18da424 100644 --- a/openjpa-project/LICENSE +++ b/openjpa-project/LICENSE @@ -427,6 +427,8 @@ The exceptions are as follows: http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd) orm_3_0-xsd.rsrc - Eclipse Public License v2.0 - included in the openjpa jar, taken from: https://jakarta.ee/xml/ns/persistence/orm/orm_3_0.xsd + orm_3_1-xsd.rsrc - Eclipse Public License v2.0 - included in the openjpa jar, taken from: + https://jakarta.ee/xml/ns/persistence/orm/orm_3_1.xsd persistence-xsd.rsrc - included in the openjpa jar, taken from: http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd) persistence_2_0-xsd.rsrc - included in the openjpa jar, taken from: diff --git a/openjpa/src/main/appended-resources/META-INF/LICENSE.vm b/openjpa/src/main/appended-resources/META-INF/LICENSE.vm index bd3f7cfc5..7ab3c1559 100644 --- a/openjpa/src/main/appended-resources/META-INF/LICENSE.vm +++ b/openjpa/src/main/appended-resources/META-INF/LICENSE.vm @@ -42,6 +42,8 @@ openjpa-persistence - http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd) orm_3_0-xsd.rsrc - Eclipse Public License v2.0 - included in the openjpa jar, taken from: https://jakarta.ee/xml/ns/persistence/orm/orm_3_0.xsd + orm_3_1-xsd.rsrc - Eclipse Public License v2.0 - included in the openjpa jar, taken from: + https://jakarta.ee/xml/ns/persistence/orm/orm_3_1.xsd persistence-xsd.rsrc - CDDL 1.0 - included in the openjpa jar, taken from: http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd) persistence_2_0-xsd.rsrc - CDDL 1.0 - included in the openjpa jar, taken from: