2015-03-23 4 views
1

У нас есть таблица DB user, которая развивалась совсем немного, и мы не хотим загружать унаследованных пользователей в приложение. Устаревший пользователь идентифицируется по столбцу user_type.Есть ли способ унаследовать аннотацию @Where Hibernate?

Если я использую следующее отображение, то все работает, как ожидалось:

@Entity 
@Table(name="user") 
@Where("user_type = 2") // 1 is legacy 
class User { 

    @Column(name="user_type") 
    int type; 
} 

Мне нужно отобразить user таблицы несколько раз, и я хочу остаться DRY. Так я думал, что я могу извлечь @Where немного в супер класс и наследовать его, как так:

@Where("type = 2") // 1 is legacy 
abstract class BaseUser { 
} 

@Entity 
@Table(name="user") 
class User extends BaseUser { 
} 

У меня есть следующий тест (я надеюсь, что это само за себя достаточно), что не может, хотя:

@Test 
@DbUnitData("legacy_user.xml") // populates DB with 1 user (id=1) with type=1 
public void shouldNotGetLegacyUser() { 
    assertThat(em.find(User.class, 1L)).isNull(); 
} 

Есть ли способ наследования класса с аннотацией @Where Hibernate?

ответ

2

Что вы действительно ищете, это не @Where, а @DiscriminatorColumn и @DiscriminatorValue. Эти аннотации позволяют сопоставлять два объекта @Entity с одной таблицей на основе @DiscriminatorColumn.

Hibernate руководство содержит пункт о нем: Mapping inheritance

Вы бы в основном создать суперкласс, BaseUser и два Sub-классы, LegacyUser и Пользователь:

@Entity 
@Table(name = "COM_ORDER") 
@DiscriminatorColumn(name = "COM_ORDER_TYPE", discriminatorType = DiscriminatorType.INTEGER) 
public class BaseUser { 
    @Id 
    private Long id; 
    <Enter your generic columns here, you do not need to add the user_type column> 
} 

@Entity 
@DiscriminatorValue("1") 
public class LegacyUser extends BaseUser { 
    <Enter your legacy specific fields here> 
} 

@Entity 
@DiscriminatorValue("2") 
public class LatestUser extends BaseUser { 
    <Enter your new and improved user fields here> 
} 

С помощью этой установки, позволяют с легкостью расширьте количество типов пользователей, создав новые классы, которые расширяют класс BaseUser. Вы должны иметь в виду, что поля в фактической таблице могут быть не равными нулю для полей в классе BaseUser. Поля в классах, связанных с UserType, всегда должны быть нулевыми в базе данных, так как они будут использоваться только определенным типом пользователя.

Редактировать: Я отредактировал пример, чтобы соответствовать настройке, которую я сейчас использую в своем собственном проекте. Эта настройка работает отлично для меня.

+0

Это не работает для меня. Сначала он жаловался на отсутствующий идентификатор в «BaseUser», поэтому я добавил его. Теперь он жалуется на это: 'org.hibernate.mapping.SingleTableSubclass не может быть передан в org.hibernate.mapping.RootClass' – Xorty

+0

вправо, поэтому я нашел проблему - кажется, что I * не может * сопоставить собственно столбец дискриминатора в классе детей ... – Xorty

Смежные вопросы