我建了一个简单的DAO,使用的spring+hibernate框架,数据库表是一个users表,实体如下:
package com.ssh.entity;import java.io.Serializable;public class Users implements Serializable {
private static final long serialVersionUID = 1L; private Long userid; private String username; private String password; private Long role;
public Long getUserid() {
return this.userid;
} public void setUserid(Long userid) {
this.userid = userid;
} public String getUsername() {
return this.username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} public Long getRole() {
return this.role;
} public void setRole(Long role) {
this.role = role;
}
}
定义了一个泛型的接口GenericDao用来执行增删改和读取操作也就是CRUD:
package com.fan;import java.io.Serializable;public interface GenericDao<T,PK extends Serializable> {
PK create(T newInstance);
T read(PK id);
void update(T transientObject);
void delete(T persistentObject);
}再看看他的实现:
package com.fan;import java.io.Serializable;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class GenericDaoHibernateImpl<T,PK extends Serializable> extends HibernateDaoSupport implements GenericDao,FinderExecutor {
private Class type; public GenericDaoHibernateImpl(Class ctype){
this.type=ctype;
} public void delete(Object persistentObject) {
this.getHibernateTemplate().delete(persistentObject);
} @SuppressWarnings("unchecked")
public T read(Serializable id) {
return (T)this.getHibernateTemplate().get(type,id);
} public void update(Object transientObject) {
this.getHibernateTemplate().merge(transientObject);
} @SuppressWarnings("unchecked")
public PK create(Object newInstance) {
return (PK)this.getHibernateTemplate().save(newInstance);
}
}这样实现没有任何问题,但是很明显方法参数和接口的不同,是具体类型并不是泛型,返回值可以用泛型。我所期望的实现应该是这样的: public void delete(T persistentObject) {
this.getHibernateTemplate().delete(persistentObject);
} @SuppressWarnings("unchecked")
public T read(PK id) {
return (T)this.getHibernateTemplate().get(type,id);
} public void update(T transientObject) {
this.getHibernateTemplate().merge(transientObject);
} @SuppressWarnings("unchecked")
public PK create(T newInstance) {
return (PK)this.getHibernateTemplate().save(newInstance);
}
当我改成这样以后就报编译错,说这两个方法has same erasure but does not override it.
spring-config.xml:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:Oracle9I</value>
</property>
<property name="username">
<value>joe</value>
</property>
<property name="password">
<value>joe</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/ssh/entity/Users.hbm.xml</value>
</list>
</property>
</bean>
<bean id="usersDao" class="com.fan.GenericDaoHibernateImpl">
<constructor-arg index="0">
<value>com.ssh.entity.Users</value>
</constructor-arg>
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
对于泛型我是初学者,请各位高手指出我这样做是否可行,或者错误在哪里,谢谢。
package com.ssh.entity;import java.io.Serializable;public class Users implements Serializable {
private static final long serialVersionUID = 1L; private Long userid; private String username; private String password; private Long role;
public Long getUserid() {
return this.userid;
} public void setUserid(Long userid) {
this.userid = userid;
} public String getUsername() {
return this.username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} public Long getRole() {
return this.role;
} public void setRole(Long role) {
this.role = role;
}
}
定义了一个泛型的接口GenericDao用来执行增删改和读取操作也就是CRUD:
package com.fan;import java.io.Serializable;public interface GenericDao<T,PK extends Serializable> {
PK create(T newInstance);
T read(PK id);
void update(T transientObject);
void delete(T persistentObject);
}再看看他的实现:
package com.fan;import java.io.Serializable;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class GenericDaoHibernateImpl<T,PK extends Serializable> extends HibernateDaoSupport implements GenericDao,FinderExecutor {
private Class type; public GenericDaoHibernateImpl(Class ctype){
this.type=ctype;
} public void delete(Object persistentObject) {
this.getHibernateTemplate().delete(persistentObject);
} @SuppressWarnings("unchecked")
public T read(Serializable id) {
return (T)this.getHibernateTemplate().get(type,id);
} public void update(Object transientObject) {
this.getHibernateTemplate().merge(transientObject);
} @SuppressWarnings("unchecked")
public PK create(Object newInstance) {
return (PK)this.getHibernateTemplate().save(newInstance);
}
}这样实现没有任何问题,但是很明显方法参数和接口的不同,是具体类型并不是泛型,返回值可以用泛型。我所期望的实现应该是这样的: public void delete(T persistentObject) {
this.getHibernateTemplate().delete(persistentObject);
} @SuppressWarnings("unchecked")
public T read(PK id) {
return (T)this.getHibernateTemplate().get(type,id);
} public void update(T transientObject) {
this.getHibernateTemplate().merge(transientObject);
} @SuppressWarnings("unchecked")
public PK create(T newInstance) {
return (PK)this.getHibernateTemplate().save(newInstance);
}
当我改成这样以后就报编译错,说这两个方法has same erasure but does not override it.
spring-config.xml:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:Oracle9I</value>
</property>
<property name="username">
<value>joe</value>
</property>
<property name="password">
<value>joe</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/ssh/entity/Users.hbm.xml</value>
</list>
</property>
</bean>
<bean id="usersDao" class="com.fan.GenericDaoHibernateImpl">
<constructor-arg index="0">
<value>com.ssh.entity.Users</value>
</constructor-arg>
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
对于泛型我是初学者,请各位高手指出我这样做是否可行,或者错误在哪里,谢谢。
我用的是eclipse5.1,JDK是5.0,我想应该不是环境的问题,因为泛型是可以用的。
public class GenericDaoImpl<T,PK extends Serializable>{ public PK create(T newInstance) {
// TODO Auto-generated method stub
return null;
} public void delete(T persistentObject) {
// TODO Auto-generated method stub
} public Object read(PK id) {
// TODO Auto-generated method stub
return null;
}
public void update(T transientObject) {
// TODO Auto-generated method stub
}
}
package com.fan;import java.io.Serializable;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class GenericDaoHibernateImpl<T,PK extends Serializable> extends HibernateDaoSupport implements GenericDao<T,Serializable>,FinderExecutor {
private Class type; public GenericDaoHibernateImpl(Class ctype){
this.type=ctype;
} public void delete(T persistentObject) {
this.getHibernateTemplate().delete(persistentObject);
} @SuppressWarnings("unchecked")
public T read(PK id) {
return (T)this.getHibernateTemplate().get(type,id);
} public void update(T transientObject) {
this.getHibernateTemplate().merge(transientObject);
}
@SuppressWarnings("unchecked")
public PK create(T newInstance) {
return (PK)this.getHibernateTemplate().save(newInstance);
}
}
这样就可以了,帮我一起思考的仁兄一样有分。
包括方法名,返回值,参数必须一致!