Hibernate and ManyToMany + @OrderColumn returns 42075 Null records

Viewed 32

when I use @OrderColumn annotation, Hibernate returns collection with 42075 [Null] records, but without @OrderColumn everything works perfectly why? I want to use field "OrderNumber" to have always ordered entity by this field. The type of this "OrderNumber" on PostgreSQL side is "serial" with auto increasing count.

DocTestEntity:

@Entity
@Table(name = "`Document`")
public class DocTestEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "`Document_ID`")
    private Integer id;


    @ManyToMany
    @JoinTable(name = "`DocumentEmployee`",
            joinColumns = @JoinColumn(name = "`Document_ID`"),
            inverseJoinColumns = @JoinColumn(name = "`Employee_ID`"))
    @OrderColumn(name ="`OrderNumber`", updatable = false, insertable = false)
    private List<EmployeeTestEntity> employeeEntityList;


    public Integer getId() {
        return id;
    }

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

    public List<EmployeeTestEntity> getEmployeeEntityList() {
        return employeeEntityList;
    }

    public void setEmployeeEntityList(List<EmployeeTestEntity> employeeEntityList) {
        this.employeeEntityList = employeeEntityList;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        DocTestEntity docEntity = (DocTestEntity) o;
        return Objects.equals(id, docEntity.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }




    @Override
    public String toString() {
        return "DocTestEntity{" +
                "id=" + id +
                '}';
    }
}

EmployeeTestEntity:

@Entity
@Table(name = "`Employee`")
public class EmployeeTestEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "`Employee_ID`")
    private Integer id;

    @Column(name = "`Employee_name`")
    private String name;

    @Column(name = "`Employee_surname`")
    private String surname;
    


    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String employeeName) {
        this.name = employeeName;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String employeeSurname) {
        this.surname = employeeSurname;
    }



    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        EmployeeTestEntity that = (EmployeeTestEntity) o;
        return Objects.equals(id, that.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    



    @Override
    public String toString() {
        return "EmployeeTestEntity{" +
                "id=" + id +
                '}';
    }

}

And Test DAO:

@Stateless
public class DocTestDAO {

    @PersistenceContext
    private EntityManager em;



    public DocTestEntity selectDocumentByID(Integer id) {


        var result = em.createQuery("SELECT DISTINCT a from DocTestEntity a " +
                        " WHERE a.id = :id ", DocTestEntity.class)
                .setParameter("id", id)
                .getResultStream()
                .map(Optional::ofNullable)
                .findFirst()
                .flatMap(Function.identity())
                .orElse(null);


        System.out.println("List records count is: " + result.getEmployeeEntityList().size());


        return result;

    }

}
1 Answers

You don't need the OrderNumber column to be autoincremented, the hibernate can manage the order column itself depending on the order of the items in the collection employeeEntityList.

You should make the OrderNumber to be insertable and updatable (true by default):

@OrderColumn(name = "OrderNumber")

I would recommend cleaning up the code, removing these apostrophes from the column names "`DocumentEmployee`" should be "DocumentEmployee". You mentioned that everything could work without @OrderColumn, so I suppose apostrophes don't affect the functionality but look weird.

Please let me know if this still doesn't work after mentioned updates.

Related