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

Adds support for using MonetaryAmount in @ElementCollection #652

Closed
Sarrruman opened this issue Sep 19, 2023 · 6 comments
Closed

Adds support for using MonetaryAmount in @ElementCollection #652

Sarrruman opened this issue Sep 19, 2023 · 6 comments
Milestone

Comments

@Sarrruman
Copy link

Entity X containing @ElementCollection of type Y, where Y has a field of type MonetaryAmount, does not pass Hibernate's "metadata building" phase and raises following exception:

org.hibernate.MappingException: Could not instantiate collection persister implementor org.hibernate.persister.collection.BasicCollectionPersister for collection-role ...

@Sarrruman
Copy link
Author

    @Entity(name = "Salary")
    @Table(name = "salary")
    public static class Salary {
        @Id
        @GeneratedValue
        private long id;

        private String other;

        @ElementCollection
        private List<SalaryComponent> components = new ArrayList<>();

        public long getId() {
            return id;
        }

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

        public List<SalaryComponent> getComponents() {
            return components;
        }

        public String getOther() {
            return other;
        }

        public void setOther(String other) {
            this.other = other;
        }
    }

    @Embeddable
    public static class SalaryComponent {
        @AttributeOverride(name = "amount", column = @Column(name = "salary_amount"))
        @AttributeOverride(name = "currency", column = @Column(name = "salary_currency"))
        @CompositeType(MonetaryAmountType.class)
        private MonetaryAmount value;

        public SalaryComponent(MonetaryAmount value) {
            this.value = value;
        }

        public SalaryComponent() {

        }

        public MonetaryAmount getValue() {
            return value;
        }

        public void setValue(MonetaryAmount value) {
            this.value = value;
        }
    }

@vladmihalcea
Copy link
Owner

Looking forward to your Pull Request that fixes the issue.

@Sarrruman
Copy link
Author

Exception is raised because org.hibernate.cfg.PropertyContainer, which is responsible for the creation of metadata for the @Embeddable class, incorrectly constructs metadata for the embeddable type, because MonetaryAmountMapper doesn’t have getters&setters for its fields.

org.hibernate.cfg.PropertyContainer's contstructor is getting passed DEFAULT for defaultClassLevelAccessType parameter, which is then set to AccessType.PROPERTY, which results in PropertyContainer’s constructor relying on getters, instead of fields, for populating persistingAttributes.

In other cases (non-@ElementCollection ones), AccessLevel.FIELD is being passed in, thus not requiring MonetaryAmountMapper’s getters and resulting in correct mapping by Hibernate.

Sarrruman pushed a commit to Sarrruman/hypersistence-utils that referenced this issue Sep 19, 2023
@vladmihalcea
Copy link
Owner

As I explained in my High-Performance Java Persistence book, @ElementCollection is a bad idea anyway.

So, you are better off using a bidirectional one-to-many where the MonetaryAmount is just a basic property in the child entity.

@Sarrruman
Copy link
Author

Sarrruman commented Sep 19, 2023

I have a specific use-case: list, very short one, of value objects - something similar to the example I created in PostgreSQLMonetaryAmountTypeElementCollectionTest: Salary that is comprised of a couple of value components (VO in terms of DDD). They don't have their id etc..

@vladmihalcea vladmihalcea changed the title MonetaryAmountType doesn't work with @ElementCollection (hypersistence-utils-hibernate-60) Make the MonetaryAmountType work with @ElementCollection Oct 12, 2023
@vladmihalcea vladmihalcea changed the title Make the MonetaryAmountType work with @ElementCollection Adds support for using MonetaryAmount in @ElementCollection Oct 12, 2023
@vladmihalcea vladmihalcea added this to the 3.6.0 milestone Oct 12, 2023
@vladmihalcea
Copy link
Owner

Fixed.

benkard pushed a commit to benkard/mulkcms2 that referenced this issue Nov 12, 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.217.0` -> `^0.219.0`](https://renovatebot.com/diffs/npm/flow-bin/0.217.2/0.219.0) |
| [io.hypersistence:hypersistence-utils-hibernate-62](https://github.com/vladmihalcea/hypersistence-utils) | compile | minor | `3.5.3` -> `3.6.0` |
| [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | patch | `3.4.2` -> `3.4.3` |
| [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | patch | `3.4.2` -> `3.4.3` |

---

### Release Notes

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

### [`v0.219.0`](flow/flow-bin@1268ec5...c184c5d)

[Compare Source](flow/flow-bin@1268ec5...c184c5d)

### [`v0.218.1`](flow/flow-bin@12afce4...1268ec5)

[Compare Source](flow/flow-bin@12afce4...1268ec5)

### [`v0.218.0`](flow/flow-bin@dc93913...12afce4)

[Compare Source](flow/flow-bin@dc93913...12afce4)

</details>

<details>
<summary>vladmihalcea/hypersistence-utils</summary>

### [`v3.6.0`](https://github.com/vladmihalcea/hypersistence-utils/blob/HEAD/changelog.txt#Version-360---October-12-2023)

\================================================================================

Implement QueryStackTraceLogger using StackWalker [#&#8203;659](vladmihalcea/hypersistence-utils#659)

Add JFR based query logger [#&#8203;658](vladmihalcea/hypersistence-utils#658)

Adds support for using MonetaryAmount in [@&#8203;ElementCollection](https://github.com/ElementCollection) [#&#8203;652](vladmihalcea/hypersistence-utils#652)

</details>

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

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

[Compare Source](quarkusio/quarkus@3.4.2...3.4.3)

##### Complete changelog

-   [#&#8203;36408](quarkusio/quarkus#36408) - Ensure that SSE builder works in native
-   [#&#8203;36404](quarkusio/quarkus#36404) - Do not exclude properties from recording that are available in sources that should always be included
-   [#&#8203;36403](quarkusio/quarkus#36403) - IBM Db2 - Register resource bundle classes for reflection
-   [#&#8203;36402](quarkusio/quarkus#36402) - Native Picocli build breaks SSE client
-   [#&#8203;36399](quarkusio/quarkus#36399) - quarkus-jdbc-db2: resource bundle missing
-   [#&#8203;36377](quarkusio/quarkus#36377) - Allow `@ClientHeaderParam` to override User-Agent
-   [#&#8203;36371](quarkusio/quarkus#36371) - Fix issue in Java migration in dev-mode
-   [#&#8203;36351](quarkusio/quarkus#36351) - Properly handle invalid response body errors in Reactive REST Client
-   [#&#8203;36329](quarkusio/quarkus#36329) - Custom User-Agent header ignored
-   [#&#8203;36326](quarkusio/quarkus#36326) - Cannot load fixed or default YAML configuration when running native build
-   [#&#8203;36302](quarkusio/quarkus#36302) - Fix headers and preambles in all guides and reintroduce some keywords
-   [#&#8203;36299](quarkusio/quarkus#36299) - quarkus-flyway: Java-Migration does not get picked up on live reload
-   [#&#8203;36290](quarkusio/quarkus#36290) - Fixed URL for configuring JSON support
-   [#&#8203;36257](quarkusio/quarkus#36257) - Rest client call hangs when receiving an invalid chunked response and does not release resources (e.g. Bulkhead semaphore)
-   [#&#8203;36147](quarkusio/quarkus#36147) - Bump org.eclipse.parsson:parsson from 1.1.2 to 1.1.4
-   [#&#8203;36096](quarkusio/quarkus#36096) - Build cache - Use notCacheableBecause instead of storeEnabled
-   [#&#8203;35929](quarkusio/quarkus#35929) - Do not store build cache for core extensions having config
-   [#&#8203;35927](quarkusio/quarkus#35927) - Build cache - Core extensions containing config shouldn't be cached
-   [#&#8203;35769](quarkusio/quarkus#35769) - Default response content type using GraphQL spec

</details>

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

### [`v3.4.3`](quarkusio/quarkus-platform@3.4.2...3.4.3)

[Compare Source](quarkusio/quarkus-platform@3.4.2...3.4.3)

</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.

---

 - [ ] <!-- 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-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants