2017-01-28 25 views
0

Я пытаюсь управлять генерацией имени внешнего ключа, используя аннотацию @ForeignKey. Это обычно работает хорошо. Но в частном случае это не то, что я хочу, и я не знаю, как его настроить.Как наследовать настройки @ForeignKey при использовании стратегии наследования TABLE_PER_CLASS

Особый случай, когда я использую @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS). Когда базовый класс имеет отношение @ManyToOne, и я хочу указать имя внешнего ключа, используя @ForeignKey, он применяется только к базовому классу.

  +------------+   +--------------+ 
     | BaseEntity | -----> | OtherEntity | 
     +------------+   +--------------+ 
       ^
       | 
     +--------+---------+ 
    +----------+  +----------+ 
    |SubEntity1|  |SubEntity2| 
    +----------+  +----------+ 

Мои BaseEntity

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "base_entity") 
public class BaseEntity { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne 
    @JoinColumn(foreignKey = @ForeignKey(name = "FK_other_entity")) 
    private OtherEntity otherEntity; 
} 

Мои SubEntity1 (то же самое для SubEntity2)

@Entity 
@Table(name = "sub_entity_1") 
public class SubEntity1 extends BaseEntity { 
} 

и просто быть полным .... OtherEntity:

@Entity 
@Table(name = "other_entity") 
public class OtherEntity { 
    @Id 
    @GeneratedValue 
    private Long id; 
} 

Hibernate будет генерировать DDL скрипт, содержащий следующие внешние определения ключевых:

alter table base_entity 
    add constraint FK_other_entity 
    foreign key (otherEntity_id) 
    references other_entity (id); 

alter table sub_entity_1 
    add constraint FK_jtmdc6tiytduxbpesmng9g3bk 
    foreign key (otherEntity_id) 
    references other_entity (id); 

alter table sub_entity_2 
    add constraint FK_9xpb6q7qeq5r3pq071cbbiygx 
    foreign key (otherEntity_id) 
    references other_entity (id); 

Как вы можете видеть суб объекты внешнего ключа имя является случайным.

Субъекты не имеют поля, содержащего ссылку на OtherEntity, поэтому я не могу разместить здесь аннотацию @ForeignKey.

Как я могу управлять именем внешнего ключа для сущностей при использовании таблицы в классе типа наследования?

Я использую

  • весна-ботинок 1.4.3.RELEASE
  • зимуют 5.6.2.Final

EDIT

Я также попытался использовать @AssociationOverride, но это не работает.


Если вам нужно быстро настроить для генерации схемы вы можете захотеть взглянуть на мой предыдущий вопрос Generate DDL with spring boot using a custom delimiter

ответ

0

Кажется, Hibernate ошибка

У меня проголосовали за за обе ошибки. Возможно, вы тоже захотите проголосовать за это, и, надеюсь, скоро он будет исправлен.

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


Мой "решение сейчас" является использование InheritanceType.JOINED

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "base_entity") 
public class BaseEntity { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne 
    @JoinColumn(foreignKey = @ForeignKey(name = "FK_other_entity")) 
    private OtherEntity otherEntity; 
} 

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

@Entity 
@Table(name = "sub_entity_1") 
@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "FK_base_entity")) 
public class SubEntity1 extends BaseEntity { 

}