Hibernate self join исключение: строка с указанным идентификатором не существует - PullRequest
0 голосов
/ 27 мая 2018

У меня есть следующая таблица

CREATE TABLE labour_no_pk ( id bigint(20) NOT NULL AUTO_INCREMENT, name varchar(255) DEFAULT NULL, labour_id bigint(20) NOT NULL, contractor_id bigint(20) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY labour_id_UNIQUE (labour_id), KEY FK_SELF_idx (contractor_id), CONSTRAINT FK_SELF FOREIGN KEY (contractor_id) REFERENCES labour_no_pk (labour_id) ON DELETE CASCADE ON UPDATE CASCADE );

Класс как

@Entity
@Table(name = "LABOUR_NO_PK")
public class LabourNoPK {
    @Id
    @Column(name = "id")
    @GeneratedValue
    private Long id;

    @Column(name = "firstname")
    private String firstName;

    @ManyToOne(cascade = { CascadeType.ALL })
    @JoinColumn(name = "labour_id")
    private LabourNoPK contractor;

    @OneToMany(mappedBy = "contractor")
    private Set<LabourNoPK> subordinates = new HashSet<LabourNoPK>();
}

DAO как

public static List<LabourNoPK> getLabours(Session session) {
        List<LabourNoPK> labours = null;
        try {
            Query query = session.createQuery("FROM LabourNoPK where contractor_id is null");
            labours = query.list();
            for (LabourNoPK labour : labours) {
                System.out.println("parent=" + labour.toString());
                if (null != labour.getSubordinates() && !labour.getSubordinates().isEmpty()) {
                    for (LabourNoPK subordinate : labour.getSubordinates()) {
                        System.out.println("Sub=" + subordinate.toString());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return labours;
    }

У меня есть данные как

enter image description here

, когда я запускаю программу, я получаю org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [LabourNoPK#100], но в БД есть запись.Я понял (из сообщения об исключении), что мой класс модели указывает на id вместо contractor_id.Как мне составить карту, чтобы получить результаты всех родителей с детьми?

Что именно мне не хватает?заранее спасибо

1 Ответ

0 голосов
/ 29 мая 2018

После долгих чтений и испытаний я могу достичь того, чего хочу.Так что постить, если кому-то нужно так же.

@Entity
@Table(name = "LABOUR_NO_PK")
public class LabourNoPK implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private Long id;

    @Column(name = "labour_id")
    @NaturalId
    private Long labourId;

    @Column(name = "firstname")
    private String firstName;

    @OneToMany(mappedBy="labour")
    private Set<LabourNoPK> subordinates = new HashSet<>();

    @ManyToOne
    @JoinColumn(name = "contractor_id", referencedColumnName = "labour_id")
    /* child (subordinate) contractor_id will be matched with parent (labour) labour_id*/
    private LabourNoPK labour;

}

enter image description here

...