javahibernateembeddable

Hibernate + JPA does not find the column for an @ElementCollection table


I am trying to add an @ElementCollection but the column is not found after the setup, so I constantly receive an error. I use Spring + flyway for the set up. Everything happens in the public schema

So here is my big object:

@Entity
@Table(name = "my_big_table")
MyBigObject{

   @Id
   @Column(name=COL_ID)
   @GeneratedValue(generator="gen_name")
   @GenericGenerator(
            name = "gen_name",
            strategy = "seq_name"
        )
   @AttributeAccessor(CommonConstants.HIBERNATE_ACCESS_PROPERTY)
   private long id;
    ...
    ...
        @ElementCollection(fetch = FetchType.EAGER)
        @CollectionTable(
            name = "my_small_table",
            joinColumns = @JoinColumn(name = "big_object_id")
        )
    private List<MySmallObject> mySmallObjects;
}

Here is my embedded object:

@Embeddable
public class MySmallObject {

    @Column(name = "small_object_type")
    private String smallObjectType;
}

Then besides the existing my_big_table table I add my_small_table using flyway

create table if not exists my_small_table
(
    big_object_id      bigint not null,
    small_object_type     varchar(64) not null
);

alter table my_small_table
      add constraint FK_my_small_table
      foreign key (big_object_id)
      references my_big_table (id);

After this the my_small_table is successfully created but any instance of MyBigObject cannot be found because it looks for a column in the my_small_table that does not exist. As you can see it does not understand that the column name should use an underscore.

Big error trace ands with the following message:
Caused by: org.postgresql.util.PSQLException: ERROR: column mysmalltab0_.smallobjecttype does 
not exist
09:17:24.994 INFO  - STDOUT:   Hint: Perhaps you meant to reference the column "mysmalltab0_.smallobjecttype".

Do you know what I could forget? Could lombock annotations that I also use for both classes spoil the picture?


Solution

  • As it's stated in the documentation:

    By default, the placement of the @Id annotation gives the default access strategy. When placed on a field, Hibernate will assume field-based access. When placed on the identifier getter, Hibernate will use property-based access.

    But the usage of the @AttributeAccessor leads to the changing access strategy for the field that hold @Id and as result your @Column(name = "small_object_type") annotation just was ignored. You can try to put it on the appropriate getter and it should work. But it's considered a good practiсe not to mix up access strategies for the entity fields.