JPA @Id для объекта @OneToOne с составным ключом - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть класс @Entity с аннотацией @Id и аннотацией @OneToOne в одном поле. Обычно это не будет проблемой, но класс сущностей поля с этими аннотациями использует составной ключ. Это вызывает больше сложностей, чем я ожидал.

Вот класс сущностей, который создает проблему:

@Entity
public class ReportDetails implements Serializable {

    @Id
    @OneToOne
    private MachineLine machineLine;
}

А вот класс сущностей MachineLine, который используется как Идентификатор в ReportDetails:

@Entity
@IdClass(MachineLine.MachineLineKey.class)
public class MachineLine {

    @Id
    @ManyToOne
    private Machine machine;

    @Id
    private long lineIndex;

    public static class MachineLineKey implements Serializable {
        private Machine machine;
        private long lineIndex;
    }
}

Я исключил любые дополнительные поля и методы получения и установки из этих определений классов, чтобы сэкономить место.

Когда я пытаюсь запустить свое приложение, дает следующее исключение:

java.lang.IllegalArgumentException: This class [class ReportDetails] does not define an IdClass

Когда я ставлю аннотацию @IdClass на ReportDetails, тогда требуется определение отдельных полей любого класса, который я определяю в @IdClass, например в MachineLine. Однако я стараюсь избегать этого, чтобы вся сущность MachineLine возвращалась всякий раз, когда сущность ReportDetails извлекается из базы данных.

Есть ли способ иметь MachineLine в качестве Поле идентификатора ReportDetails, без необходимости определения дополнительных полей в ReportDetails?

1 Ответ

1 голос
/ 04 февраля 2020

Это то, что JPA называет «производной личностью». Вы можете попробовать что-то вроде этого:

ReportDetails:

@Entity
public class ReportDetails implements Serializable {
    // all attributes map by the relationship: AttributeOverride is not allowed
    @EmbeddedId
    private MachineLine.Id id;

    @MapsId
    @JoinColumns({
        @JoinColumn(name="machineId", referencedColumnName="machineId"),
        @JoinColumn(name="machineLineIndex", referencedColumnName="index")
    })
    @OneToOne
    private MachineLine machineLine;

    // ...
}

MachineLine:

@Entity
public class MachineLine {

    @EmbeddedId
    private Id id;

    @MapsId("machineId") // maps machineId attribute of embedded id
    @ManyToOne
    private Machine machine;

    // ...

    @Embeddable
    public static class Id implements Serializable {
        private long machineId; // corresponds to PK type of Machine
        private long index;
        // ...
    }
}

Machine:

@Entity
public class Machine {

    @Id
    private long id;

    @OneToMany(mappedBy = "machine")
    private List<MachineLine> lines;

    // ...
}

Обсуждаются полученные идентификаторы (с примерами) в JPA 2.2 spe c в разделе 2.4.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...