Сопоставление OneToOne с составным ключом, позволяющее сохранить каскад - PullRequest
0 голосов
/ 04 июля 2019

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

Вот так:

Допустим, у меня есть такое отображение:

BREAK

@Entity
@Table(name = "TB_ECRAN")
public class Break extends AbstractCommonEntity {

    @Id
    @GeneratedValue(generator = "id_gen_break", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "id_gen_break", sequenceName = "SQ_ECRAN", allocationSize = 1)
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumns({
        @JoinColumn(name = "ID", referencedColumnName = "ECRAN_ID", insertable = false, updatable = false),
        @JoinColumn(name = "CIBLE_TARIF_ID", referencedColumnName = "CIBLE_ID", insertable = false, updatable = false)
    })
    private Audience targettedAudience;

    // other properties, get/set and so on
}

AUDIENCE

@Entity
@Table(name = "TB_AUDIENCES")
public class Audience implements Serializable {

    @Id
    @GeneratedValue(generator = "id_gen_audience", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "id_gen_audience", sequenceName = "SQ_AUDIENCES", allocationSize = 1)
    private Long id;

    @Column(name = "CIBLE_ID")
    private Long targetId;

    @Column(name = "ECRAN_ID")
    private Long breakId;

    // other properties, get/set and so on
}

Это самое близкое к мне стремление достичь того, чего я хочу, а именно:

  • Один Разрыв сущности имеет одну и только одну Аудиторию
  • Одна Аудитория имеет один и только один Разрыв
  • Отношение определяется следующим составным ключом: Аудитория разрыва - это Аудитория, которая Audience.breakId == Break.id AND Audience.targetId == Break.pricingTargetId
  • Когда я создаю новый Брейк, я также создаю для него новую Аудиторию, сохраняю ее в своей сущности и сохраняю Брейк, который также должен сохранить Аудиенцию каскадом

Этопоследний пункт, который не работает, с приведенным выше кодом я могу получить разрыв с егоАудитория, но когда я хочу создать / обновить свой перерыв, он не может создать аудиторию по каскаду, я должен вручную определить Audience.breakId и Audience.targetId, чтобы он работал.

Я искалИнтернет часами просил помощи вокруг, но, как ни странно (это не может быть таким экзотическим случаем !?), ничего не работает ... у кого-нибудь есть идеи, как решить эту проблему?Большое спасибо заранее :) 1033 *

...