我们有一个数据库表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
注释继承一个类?
答案 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相关类中的字段应始终在数据库中为空,因为它们只能由特定用户类型使用。
编辑: 我编辑示例以符合我目前在我自己的项目中使用的设置。这个设置对我来说很好。