////
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
////
= Arthur OpenJPA Knights

Arthur OpenJPA knight is responsible to enable OpenJPA support for Graal native-image.

== Coordinates

[source,xml]
----
<dependency>
  <groupId>org.apache.geronimo.arthur.knights</groupId>
  <artifactId>openjpa-knight</artifactId>
  <version>${arthur.version}</version>
</dependency>
----

== Usage

The `openjpa-knight` handles resources, resource bundles and reflection setup for HSQLDB.


You must register the hsqldb knight in `arthur-maven-plugin`:


[source,xml]
----
<plugin>
  <groupId>org.apache.geronimo.arthur</groupId>
  <artifactId>arthur-maven-plugin</artifactId>
  <version>${arthur.version}</version>
  <configuration>
    <main>org.company.Main</main>
    <graalExtensions>
      <graalExtension>openjpa</graalExtension>
    </graalExtensions>
  </configuration>
</plugin>
----

If you need an embedded database you can use link:hsqldb-knight.html[HSQLDB] which is supported as well in native mode.

---

Previous: link:knights.html[Knights]
