gpt4 book ai didi

java - 有没有办法继承Hibernate的@Where注解?

转载 作者:行者123 更新时间:2023-11-30 03:30:12 24 4
gpt4 key购买 nike

我们有一个数据库表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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com