Hibernate как использовать константу как часть составной внешней ссылки - PullRequest
4 голосов
/ 19 января 2012

У меня есть главная таблица A с составным первичным ключом, состоящим из двух столбцов.Один из этих столбцов - это константа («ПОСТОЯННОЕ ЗНАЧЕНИЕ» в приведенном ниже коде).Это определение таблицы выглядит следующим образом:

@Entity public class Master {
  @Id
  @Column(name = "SIGNIFICANT_KEY")
  private String realKey;

  @Id
  @Column(name = "CONSTANT_KEY")
  private String constantPartKey;
}

У меня есть таблица подробностей B, ссылающаяся на основную таблицу A, использующую только один (непостоянный) столбец.Я хочу реализовать обычные отношения ManyToOne и OneToMany между двумя таблицами.

Вопрос : Как мне справиться с этой ситуацией в Hibernate?

Единственное решение для основной справки Iнайденное основано на использовании формул :

@Entity public class Detail {
  @ManyToOne
  @JoinColumnsOrFormulas(value={
    @JoinColumnOrFormula(column=
      @JoinColumn(name = "SIGNIFICANT_KEY",
                  referencedColumnName = "SIGNIFICANT_KEY",
                  insertable=false, updatable=false, nullable = false)),
    @JoinColumnOrFormula(formula=
      @JoinFormula(referencedColumnName="CONSTANT_KEY", value="'THE CONSTANT VALUE'"))
  })
  Master master;
}

Теперь я вижу другую проблему: я не могу использовать это поле в отношении OneToMany из-за проблемы java.lang.ClassCastException, о которой я сообщал ранее: https://hibernate.onjira.com/browse/HHH-6811

1 Ответ

3 голосов
/ 19 января 2012

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

Что я хотел бы сделать, это только сопоставить непостоянный столбец как идентификатор и сделать постоянный столбец регулярным столбцом с постоянным значением:

@Entity
public class Strange {
    @Id
    private Long id;

    @Column
    private long constant = 345; // the constant that you want in your database

    @OneToMany(mappedBy = "strange")
    private Set<Detail> details;

    ...
    // no setter for constant!
}

@Entity
public class Detail {
   ...
   @ManyToOne
   @JoinColumn(name = "strange_id")
   private Strange strange;
}

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

@Entity
public class Strange {
    @Id
    @Column(name = "strange_id")
    private Long id;

    @Id
    private long constant = 345; // the constant that you want in your database

    @OneToMany(mappedBy = "strange")
    private Set<Detail> details;

    ...
    // no setter for constant!
}

@Entity
public class Detail {
   ...
   @ManyToOne
   @JoinColumn(name = "strange_id", referencedColumnName = "strange_id")
   private Strange strange;
}

Вы можете ссылаться на другие объекты, используя что-то, кроме их PK. Еще один уникальный столбец тоже в порядке. А так как странный_ид уникален, он отвечает всем требованиям. В этом случае атрибут referencedColumnName должен использоваться для указания имени столбца, на который есть ссылка.

...