- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个数据库表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
位提取到父类(super class)并像这样继承它:
@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
注解继承类?
最佳答案
您真正要寻找的不是@Where,而是@DiscriminatorColumn 和@DiscriminatorValue。这些注释允许您基于 @DiscriminatorColumn 将两个 @Entity 对象映射到同一个表。
Hibernate 手册中有这样一段话: Mapping inheritance
您基本上会创建一个父类(super class) BaseUser 和两个子类 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 类中的字段只能为非空。 UserType 相关类中的字段在数据库中应始终可为空,因为它们仅由特定用户类型使用。
Edit: I've edit the example to conform to the setup I'm currently using in my own project. This setup works fine for me.
关于java - 有没有办法继承Hibernate的@Where注解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29220295/
我是一名优秀的程序员,十分优秀!