Skip to content
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

Register arrays of Hibernate ORM's JDBC basic types for reflection #35319

Merged
merged 2 commits into from
Aug 14, 2023

Conversation

yrodiere
Copy link
Member

@yrodiere yrodiere commented Aug 11, 2023

Fixes #34071

Essentially this is a workaround for https://hibernate.atlassian.net/browse/HHH-16809, which from the looks of it is not considered a priority and won't be solved anytime soon.

See also hibernate/hibernate-orm#6815 (comment)

And before anyone (i.e. @Sanne ;) ) tells me "you could have tried to detect which of those types are actually useful for a given application"... yes, I could have, but:

  1. I'd need to process @Id, @IdClass/@EmbeddedId with a single column, XML mapping, ...
  2. I couldn't do it with perfect accuracy, because it's the JDBC type that matters, and that's not the same as the property type. AttributeConverter being one example, but there are probably others.
  3. GraalVM's "features" are not a viable option either as JDBC types are all reachable through a map (i.e. GraalVM cannot distinguish being one type being retrieved or another).
  4. Frankly we're talking about just a few standard Java types (and not even those types, just their array types), so let's not bother.

@quarkus-bot
Copy link

quarkus-bot bot commented Aug 11, 2023

/cc @Sanne (hibernate-orm), @gsmet (hibernate-orm)

@quarkus-bot
Copy link

quarkus-bot bot commented Aug 11, 2023

✔️ The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

Copy link
Member

@gsmet gsmet left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good as a workaround!

@yrodiere yrodiere merged commit 8009695 into quarkusio:main Aug 14, 2023
35 checks passed
@quarkus-bot quarkus-bot bot added this to the 3.4 - main milestone Aug 14, 2023
@Sanne
Copy link
Member

Sanne commented Aug 14, 2023

Many thanks, nice to see this resolved.

For the future I'm thinking to propose an explicit SPI in ORM core: a service for ORM code itself to register elements for reflective access? It could be a no-op in regular use, but frameworks like Quarkus (and possibly others) would be able to collect types and register them on GraalVM explicitly. But I wonder if it's a good ideas, as its usefulness depends on how many of such cases we're having (certainly this case adds to an existing list), and testing for it to be thoroughly applied seems tricky - perhaps it's unnecessarily complex.

Thoughts?

@yrodiere
Copy link
Member Author

yrodiere commented Aug 14, 2023

I'm not sure this SPI really is necessary... Seems to me it would be exactly as effective, and perhaps more generic, to just have Hibernate ORM correctly avoid all dynamic, runtime reflection and instead store relevant Constructor/Method/Field/MethodHandle in its Metadata? Then IIUC GraalVM is perfectly able to deduce that those constructors/methods/fields will be accessed at runtime (at least in Quarkus, as they will be put on the heap during static init).

certainly this case adds to an existing list

Not sure about that. In this instance, the problem really is that Hibernate ORM does something like Arrays.newArray( <some variable containing a Class> ). So, it does dynamic, runtime reflection. If, instead, Hibernate ORM stored the array constructor somewhere in the metadata (e.g. in the BasicJavaType), or used some static constructor call (new Integer[<size>]), then we wouldn't have such a problem.

And if you think about it, changing Hibernate ORM to use the new SPI probably has very similar cost than changing Hibernate ORM to just avoid dynamic, runtime reflection.

@Sanne
Copy link
Member

Sanne commented Aug 14, 2023

I'm not sure this SPI really is necessary... Seems to me it would be exactly as effective, and perhaps more generic, to just have Hibernate ORM correctly avoid all dynamic, runtime reflection and instead store relevant

I agree in theory, but as this case shows sometimes practical needs hit.

We had agreed with the ORM team to stick to pretty much the guidelines you're describing, but things will naturally fall through the cracks. Which is why I'm wondering if we could have integration tests coverage within ORM to flag such needs earlier - and if we had such an SPI it would be their responsibility to fix right away rather than a "problem for downstream consumers", which inevitably gets us into problems either of twisted release dances or such bugs.

@yrodiere
Copy link
Member Author

and if we had such an SPI it would be their responsibility to fix right away rather than a "problem for downstream consumers",

IMO we'd just get in the same situation, just with an additional SPI adding complexity to the mix and (understandable) resentment/reluctance upstream because it creates additional work upstream for our (very) specific downstream needs.

At least resolving the Constructor/Method/etc. during metadata creation is arguably a good practice that might lead to (small) performance increases in general, even in JVM mode and with other frameworks, so it's not "just for those Quarkus folks".

I'm not saying "no, we should never do that", I just doubt it will solve the root of the problem, which is that Hibernate ORM doesn't get tested with the same constraints as Quarkus. That JVM agent you talked about some time ago to detect reflection that happens too late (after Metadata creation) would be a better angle of approach IMO. At least we'd be able to detect future problems (regressions) and have them fixed upstream as they appear, and we could add an allowlist for existing problems to work on them asynchronously, as time allows. That is, assuming the agent doesn't yield too many false-positives/false-negatives.

@Sanne
Copy link
Member

Sanne commented Aug 14, 2023

Sure, being able to test for this correctly is key and that's what I was suggesting above as well. Without it, a new SPI won't be very useful, but if we combine them then it's a strong win.

@gsmet gsmet modified the milestones: 3.4 - main, 3.3.0 Aug 15, 2023
@gsmet gsmet modified the milestones: 3.3.0, 3.2.5.Final Aug 24, 2023
benkard pushed a commit to benkard/mulkcms2 that referenced this pull request Aug 29, 2023
This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [flow-bin](https://github.com/flowtype/flow-bin) ([changelog](https://github.com/facebook/flow/blob/master/Changelog.md)) | devDependencies | minor | [`^0.214.0` -> `^0.215.0`](https://renovatebot.com/diffs/npm/flow-bin/0.214.0/0.215.1) |
| [org.liquibase:liquibase-maven-plugin](http://www.liquibase.org/liquibase-maven-plugin) ([source](https://github.com/liquibase/liquibase)) | build | patch | `4.23.0` -> `4.23.1` |
| [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | minor | `3.2.3.Final` -> `3.3.0` |
| [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | minor | `3.2.3.Final` -> `3.3.0` |
| [org.apache.maven.plugins:maven-enforcer-plugin](https://maven.apache.org/enforcer/) | build | minor | `3.3.0` -> `3.4.0` |

---

### Release Notes

<details>
<summary>flowtype/flow-bin</summary>

### [`v0.215.1`](flow/flow-bin@a92ce80...cbb038f)

[Compare Source](flow/flow-bin@a92ce80...cbb038f)

### [`v0.215.0`](flow/flow-bin@ca11e28...a92ce80)

[Compare Source](flow/flow-bin@ca11e28...a92ce80)

</details>

<details>
<summary>liquibase/liquibase</summary>

### [`v4.23.1`](https://github.com/liquibase/liquibase/blob/HEAD/changelog.txt#Liquibase-4231-is-a-patch-release)

[Compare Source](liquibase/liquibase@v4.23.0...v4.23.1)

</details>

<details>
<summary>quarkusio/quarkus</summary>

### [`v3.3.0`](https://github.com/quarkusio/quarkus/releases/tag/3.3.0)

[Compare Source](quarkusio/quarkus@3.2.4.Final...3.3.0)

##### Complete changelog

-   [#&#8203;35350](quarkusio/quarkus#35350) - Fix package type system property clearing
-   [#&#8203;35348](quarkusio/quarkus#35348) - quarkus-maven-plugin runs native building even if the profile is commented out
-   [#&#8203;35343](quarkusio/quarkus#35343) - ArC: fix StackOverflowError in AutoAddScopeBuildItem
-   [#&#8203;35319](quarkusio/quarkus#35319) - Register arrays of Hibernate ORM's JDBC basic types for reflection
-   [#&#8203;35315](quarkusio/quarkus#35315) - Fix Datasource timing issues with Liquibase / Flyway and OpenTelemetry
-   [#&#8203;35314](quarkusio/quarkus#35314) - Regression in 3.3.0.CR1: Synthetic bean instance for io.opentelemetry.api.OpenTelemetry not initialized yet
-   [#&#8203;35312](quarkusio/quarkus#35312) - Updates Infinispan to 14.0.13.Final
-   [#&#8203;35308](quarkusio/quarkus#35308) - Lock jib execution to avoid OverlappingFileLockException in parallel builds
-   [#&#8203;35305](quarkusio/quarkus#35305) - Fix the titles of the tables in RESTEasy Reactive doc
-   [#&#8203;35302](quarkusio/quarkus#35302) - Docs: Mention wilcard support in resteasy reactive XML serialisation exclude classes configuration
-   [#&#8203;35301](quarkusio/quarkus#35301) - Fix potential NPE in quarkus-csrf-reactive when no MediaType is found
-   [#&#8203;35299](quarkusio/quarkus#35299) - Output build graph using `quarkus.builder.graph-output` property
-   [#&#8203;35285](quarkusio/quarkus#35285) - NullPointerException during http post request when quarkus-csrf-reactive extension is added to a project
-   [#&#8203;35283](quarkusio/quarkus#35283) - Upgrade proto-google-common-protos to 2.23.0
-   [#&#8203;35282](quarkusio/quarkus#35282) - Avoid keeping references to BytecodeRecorderImpl
-   [#&#8203;35276](quarkusio/quarkus#35276) - Reinstate DevModeTestUtil to avoid breaking other projects that depend on it
-   [#&#8203;35273](quarkusio/quarkus#35273) - Fix small typo in comment
-   [#&#8203;35263](quarkusio/quarkus#35263) - Stop the recovery service while ArC is still around
-   [#&#8203;35245](quarkusio/quarkus#35245) - Add missing info to init Jobs
-   [#&#8203;35244](quarkusio/quarkus#35244) - Init Jobs are missing ServiceAccount and Image Pull Secrets
-   [#&#8203;35240](quarkusio/quarkus#35240) - Update SmallRye Health to 4.0.4
-   [#&#8203;34071](quarkusio/quarkus#34071) - 3.1.1 Final - java.lang.IllegalArgumentException: Class java.util.UUID\[] is instantiated reflectively but was never registered
-   [#&#8203;32800](quarkusio/quarkus#32800) - Duplicated checks in health check response
-   [#&#8203;11903](quarkusio/quarkus#11903) - Gradle multimodule project + quarkus-container-image-jib: OverlappingFileLockException

### [`v3.2.4.Final`](https://github.com/quarkusio/quarkus/releases/tag/3.2.4.Final)

[Compare Source](quarkusio/quarkus@3.2.3.Final...3.2.4.Final)

##### Complete changelog

-   [#&#8203;35300](quarkusio/quarkus#35300) - Fix `jandex-gradle-plugin-version` in CDI Reference
-   [#&#8203;35296](quarkusio/quarkus#35296) - Upgrade H2 to 2.2.220
-   [#&#8203;35258](quarkusio/quarkus#35258) - CDI Reference 1.1 has incomplete information for gradle
-   [#&#8203;35255](quarkusio/quarkus#35255) - Quartz: QuarkusMSSQLDelegate should extends MSSQLDelegate
-   [#&#8203;35211](quarkusio/quarkus#35211) - Document Maven config options that may be relevant when running tests
-   [#&#8203;35203](quarkusio/quarkus#35203) - Pass Maven user settings when initializing artifact resolver
-   [#&#8203;35193](quarkusio/quarkus#35193) - OpenTelemetry service name should have higher priority than app name when no resource attributes are set
-   [#&#8203;35189](quarkusio/quarkus#35189) - Quarkus CLI fixes
-   [#&#8203;35188](quarkusio/quarkus#35188) - SmallRyeGraphQLOverWebSocketHandler: use order value > Integer.MIN_VALUE
-   [#&#8203;35181](quarkusio/quarkus#35181) - REST Data with Panache should not produce links when hal is disabled
-   [#&#8203;35174](quarkusio/quarkus#35174) - Ensure the narayana-jta extension fully shuts down the recovery manager
-   [#&#8203;35172](quarkusio/quarkus#35172) - Kafka Streams: restore the feature name at Quarkus startup
-   [#&#8203;35171](quarkusio/quarkus#35171) - kafka-streams: feature not listed on startup
-   [#&#8203;35165](quarkusio/quarkus#35165) - Propagate all user methods in REST Data with Panache
-   [#&#8203;35160](quarkusio/quarkus#35160) - Properly use internal links to point to other guides
-   [#&#8203;35140](quarkusio/quarkus#35140) - ArC: fix deadlock when calling guarded methods on the same thread
-   [#&#8203;35136](quarkusio/quarkus#35136) - Deadlock while calling write-locked method from read-locked method
-   [#&#8203;34908](quarkusio/quarkus#34908) - `@RouteFilter` stopped working with WebSocket requests Quarkus 3.2.0.Final
-   [#&#8203;34875](quarkusio/quarkus#34875) - Quarkus build does not work since 3.2.0 with teamcity/plexus launcher
-   [#&#8203;34713](quarkusio/quarkus#34713) - Option to track build configuration for changes between builds
-   [#&#8203;34576](quarkusio/quarkus#34576) - Live reload stopped working on 3.2 when using XA transactions
-   [#&#8203;34514](quarkusio/quarkus#34514) - Support `@WithUnnamedKey` in documentation
-   [#&#8203;34065](quarkusio/quarkus#34065) - Add support for project Java version update based on extensions
-   [#&#8203;33317](quarkusio/quarkus#33317) - OpenTelemetry SDK autoconfiguration ignores OTEL service name in favor of Quarkus app name
-   [#&#8203;15461](quarkusio/quarkus#15461) - Quarkus tests fails mTLS authentication against internal Maven repository

</details>

<details>
<summary>quarkusio/quarkus-platform</summary>

### [`v3.3.0`](quarkusio/quarkus-platform@3.2.4.Final...3.3.0)

[Compare Source](quarkusio/quarkus-platform@3.2.4.Final...3.3.0)

### [`v3.2.4.Final`](quarkusio/quarkus-platform@3.2.3.Final...3.2.4.Final)

[Compare Source](quarkusio/quarkus-platform@3.2.3.Final...3.2.4.Final)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This MR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [x] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4yNC4wIiwidXBkYXRlZEluVmVyIjoiMzQuMjQuMCJ9-->
@yrodiere yrodiere deleted the i34071-uuid-array branch January 29, 2024 11:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
3 participants