2012-01-19 1 views
4

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

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

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

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

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

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

@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

Как первичный ключ состоит из постоянного столбца? В ситуации, в которой вы описываете «реальный» ключ, находится непостоянный столбец составного ключа. –

+0

@James DW Конкретное наследие * приложение * использует постоянное значение для второй части ключа. То же приложение имеет таблицу подробностей, которая опирается на эту «функцию». – Vladimir

ответ

3

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

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

@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; 
} 

Если другие объекты ссылка на этот же 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; 
} 

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

+0

Нет, у меня другая ситуация. Моя база данных является устаревшей, поэтому я не могу изменить схему. В главной таблице есть * два * реальных столбца, содержащих первичный ключ. Из этих двух столбцов вторая всегда имеет такое же значение. – Vladimir

+0

Я никогда не говорил вам менять схему. Я просто сказал вам отображать только столбец переменной составного ПК в качестве идентификатора объекта. Поскольку другой столбец никогда не изменяется, не имеет значения, является ли он частью идентификатора объекта или нет. –

+0

Нет, у меня другая ситуация. Моя база данных является устаревшей, поэтому я не могу изменить схему. В главной таблице есть * два * реальных столбца, содержащих первичный ключ. Из этих двух столбцов вторая всегда имеет такое же значение. Таблица подробностей имеет только * один * столбец, указывающий на основную таблицу. Если бы это были два столбца, я бы использовал @ ManyToOne с нотой @ JoinColumns, в которой перечислены эти два столбца. Я должен использовать что-то вместо недостающего столбца. – Vladimir