有没有办法继承Hibernate的@Where注释?

时间:2015-03-23 21:00:38

标签: java hibernate

我们有一个数据库表user进化了很多,我们不想将旧用户加载到应用程序中。旧版用户由user_type列标识。

如果我使用以下映射,那么一切都按预期工作:

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

有没有办法使用Hibernate' @Where注释继承一个类?

1 个答案:

答案 0 :(得分:2)

你真正想要的不是@Where,而是@DiscriminatorColumn和@DiscriminatorValue。这些注释允许您基于@DiscriminatorColumn将两个@Entity对象映射到同一个表。

Hibernate手册上有一个段落: Mapping inheritance

你基本上会创建一个超类,BaseUser和两个Sub类,LegacyUser和User:

@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类中的字段,实际表上的字段只能为null。 UserType相关类中的字段应始终在数据库中为空,因为它们只能由特定用户类型使用。

  

编辑:   我编辑示例以符合我目前在我自己的项目中使用的设置。这个设置对我来说很好。