2013-09-09 2 views
0

Я пытаюсь использовать Hibernate с hbm2ddl.auto, установленным в validate, так что Hibernate должен уважать мою схему БД, вместо того, чтобы автоматически генерировать таблицы вокруг моих классов Java.Аннотации для таблицы/типа поиска Hibernate?

Много моих таблиц так называемый «поиск» или «ссылки» таблицы, которые в основном состоят из id, name и tag полей:

credit_card_types 
    credit_card_type_id   Ex: "12" 
    credit_card_type_name   Ex: "Visa" 
    credit_card_type_tag   Ex: "VISA" 

payment_types 
    payment_type_id    Ex: "2" 
    payment_type_name    Ex: "Google Checkout" 
    payment_type_tag    EX: "GOOGLE_CHECKOUT" 

etc. 

я хотел бы, чтобы смоделировать их следующим образом:

public class BaseLookup { 
    private Long id; 
    private String name; 
    private String tag; 

    // ...getters, setters and ctors, etc. 
} 

public class CreditCardTypes extends BaseLookup { 
    // .. perhaps a few other fields, methods, etc... 
} 

public class PaymentTypes extends BaseLookup { 
    // .. perhaps a few other fields, methods, etc... 
} 

проблема в том, что я не хочу Hibernate для поиска (проверки против) в lookups таблице: Я хочу, чтобы проверить Светлану 2 таблицы поиска называется credit_card_types и payment_types соответственно.

Какие аннотации/конфиги необходимы, чтобы разрешить этот тип наследования Java, но создать только 2 таблицы поиска (а не 3)? Спасибо заранее!

+0

Я думаю, вы можете сделать это, используя hbm.xml, но не используя аннотации. В случае с Hbm.xml вы можете просто действовать так, как будто у вас есть только одна сущность и карта CreditCardTypes и PaymentTypes, такие как сущности в одном классе. –

ответ

1

Для базового класса вы бы добавить следующее примечание:

@MappedSuperclass 
public class BaseLookup implements Serializable { 

    @Id 
    @Column (name="ID") 
    private Long id; 

    @Column (name="NAME") 
    private String name; 

    @Column 
    private String tag; 

    // ...getters, setters and ctors, etc. 
} 

И для ваших детей классов вы могли бы сделать следующее:

@Table(name = "CREDITCARDTYPES") 
public class CreditCardTypes extends BaseLookup { 
    // .. perhaps a few other fields, methods, etc... 

    @Coulmn (name="FIELD1_COLUMN_NAME") 
    private String field1; 
} 

И вы могли бы сделать второй класс в том же Способ:

@Table(name = "PAYMENTTYPES") 
public class PaymentTypes extends BaseLookup { 
    // .. perhaps a few other fields, methods, etc... 

    @Coulmn (name="FIELD2_COLUMN_NAME") 
    private String field2; 
} 
+0

Спасибо @fujy (+1) - однако ** как указать, что 'PaymentTypes # id' получает сопоставлено с полем, называемым 'payment_type_id', и что' CreditCardTypes # id' получает сопоставление с полем 'credit_card_type_id'? ** –

+0

Обе таблицы будут иметь первичный ключ, называемый' id'. Если я правильно вас понимаю, вы хотите сделать уникальное имя первичного ключа для каждой таблицы, правильно? – fujy

+0

Почти @fujy, но не совсем. Я бы хотел, чтобы моя таблица «credit_card_types» имела первичный ключ с именем «credit_card_type_id», а моя таблица «payment_types» имела первичный ключ с именем «payment_type_id». –