我在Hibernate中有道传承,下面是代码:
public class BaseDaoImpl<T> implements BaseDao<T> {
...
protected T findSingle(String hql,Object... params){
List<T> list = find(hql,params);
if(list == null || list.isEmpty()){
return null;
}
if(list.size() > 1){
logger.debug("HQL: {} does not return single element.",hql);
}
logger.info("find single: "+list.get(0));
return list.get(0);
}
}
用户DAO:
public interface UserDao<T extends User> extends BaseDao<T> {
...
public T getUserByUsername(String username);
}
我有一个域类用户和两个子类用户:Customer和Sales。我有两个dao类,分别用于客户和销售。
用户DAO:
public class UserDaoImpl<T extends User> extends BaseDaoImpl<T> implements UserDao<T>,BaseDao<T> {
public T getUserByUsername(String username) {
return findSingle("from User user where user.username = ?",username);
}
}
客户道:
public class CustomerDaoImpl extends UserDaoImpl<Customer> implements CustomerDao {
private static Logger logger = LoggerFactory.getLogger(CustomerDaoImpl.class);
public Double getDeposit(Integer id) {
Customer customer = get(Customer.class,id);
if(customer != null){
return customer.getDeposit();
}
return 0D;
}
}
销售DAO:
public class SalesRepDaoImpl extends UserDaoImpl<SalesRep> implements SalesRepDao{
}
我的问题是,当我使用CusterDap调用方法getUserByUsername()(继承自BaseDaoImpl)与销售的用户名(拥有用户名的用户是SalesRep的实例,而不是客户)时,它会抛出java.lang.ClassCastException,它抱怨SalesRep无法转换为客户。由于我使用CusterDap来查询数据库,它使用泛型类型来确保Customer道中使用的T应该是一个客户,在这种情况下,BaseDaoImpl中的findSing()方法如何返回SalesRep的实例,我认为它应该返回null,因为没有客户拥有用户名。
首先-
“来自用户”的查询不允许hibernate神奇地知道您只搜索客户。您必须更改查询或您的总体机制。
示例解决方案
public class UserDaoImpl<T extends User> extends BaseDaoImpl<T> implements UserDao<T>,BaseDao<T> {
protected Class<T> entityClass;
public UserDaoImpl(Class<T> entityClass) {
this.entityClass = entityClass;
}
public T getUserByUsername(String username) {
return findSingle("from " + getEntityName() + " entity where entity.username = ?",username);
}
protected String getEntityName() {
return entityClass.getSimpleName();
}
}
如果UserDaoImpl不是单独使用的,那么可以使用TypeTools等在运行时继承泛型类型。
我有两个实体BillingAddress和ShippingAddress映射到具有鉴别器类型列的表地址。 我能够使用不同的类型值在DB中成功保存/更新两个地址类型。 我面临的问题是当我查询地址表时,如下所示: 这工作正常,但查询ShippingAddress会引发非均匀查询结果异常,即结果中同时包含ShippingAddress和Billingaddress。请让我知道,我应该怎么做。
我有4个实体: ,,, 和4个表: 现在我想在一个查询中选择所有有课程的用户(如果存在的话)(注意用户没有课程)这个select生成如下所示: 您可以清楚地看到,Hibernate没有与t_student_course表连接 我正在使用Hibernate 4.1 Final 问题:Hibernate支持这样的查询吗 a)如果支持,那么为什么它不为实体获取课程? b)如果不支持,我如何选择所有的用户
1. 前言 本节课程和大家一起学习继承映射。通过本节课程的学习,你将了解到: 什么是继承映射; 实现继承映射的 3 种方案。 2. 继承映射 学习继承映射之前,需要搞清楚什么是继承映射? 继承是 OOP 中的概念,其目的除了复用代码之外,还用来描述对象在现实世界中的关系。 为了更好地讲解继承映射,咱们再在数据库中创建一张老师表。数据库中多了一张表,按照使用 Hibernate 的套路,理所当然应该
类继承是一个类扩展另一个类的一种方式。 因此,我们可以在现有功能之上创建新功能。 “extends” 关键字 假设我们有 class Animal: class Animal { constructor(name) { this.speed = 0; this.name = name; } run(speed) { this.speed = speed;
问题内容: 您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗? (这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。) 基类: 最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。
并尝试通过Hibernate使用策略连接实现继承,但当我使用此策略时,我收到异常: 奇怪的是,如果我选择另一个策略(单表或TABLE_PER_CLASS),错误不会出现