Search code examples
liquibasejpa-buddy

How to use `@CollectionTable` with JPA Buddy


I try to generate a Liquibase init Changelog with JPA Buddy.

Somehow, JPA Buddy is ignoring tables declared with @CollectionTable. Is it a feature that JPA Buddy does not cover?

Here is my definition:

    @ElementCollection(targetClass = CareerLevel.class)
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "inventory_bundle_career_level",
            joinColumns = {@JoinColumn(name = "inventory_bundle_id", columnDefinition = "CHAR(36)")})
    @Column(name = "career_level", columnDefinition = "VARCHAR(50)")
    private List<CareerLevel> careerLevel = new ArrayList<>();

Solution

  • Which version of JPA Buddy are you using? I'm using the latest version of JPA Buddy: 2023.2.3 and JPA Buddy generates a table for @CollectionTable correctly. For example, I created the following model based on the code snippet you provided:

    @Entity
    @Table(name = "inventory_bundle")
    public class InventoryBundle {
        @Id
        @Column(name = "id", columnDefinition = "CHAR(36)")
        private String id;
    
        @ElementCollection(targetClass = CareerLevel.class)
        @Enumerated(EnumType.STRING)
        @CollectionTable(
                name = "inventory_bundle_career_level",
                joinColumns = {
                        @JoinColumn(name = "inventory_bundle_id", columnDefinition = "CHAR(36)")
                })
        @Column(name = "career_level", columnDefinition = "VARCHAR(50)")
        private List<CareerLevel> careerLevel = new ArrayList<>();
    }
    
    public enum CareerLevel {
        ENTRY_LEVEL,
        JUNIOR,
        MID_LEVEL,
        SENIOR,
        EXECUTIVE
    }
    

    And JPA Buddy generated the following script for it:

    CREATE TABLE inventory_bundle
    (
        id CHAR(36) NOT NULL,
        CONSTRAINT pk_inventory_bundle PRIMARY KEY (id)
    );
    
    CREATE TABLE inventory_bundle_career_level
    (
        inventory_bundle_id CHAR(36) NOT NULL,
        career_level        VARCHAR(50)
    );
    
    ALTER TABLE inventory_bundle_career_level
        ADD CONSTRAINT fk_inventory_bundle_career_level_on_inventory_bundle FOREIGN KEY (inventory_bundle_id) REFERENCES inventory_bundle (id);
    

    This script matches exactly what Hibernate ddl-auto generates. Maybe your model is slightly different? I would appreciate a more detailed description of the case so that I can check it out 🙂