gpt4 book ai didi

java - Spring Generic Dao 类名

转载 作者:行者123 更新时间:2023-11-30 06:25:58 25 4
gpt4 key购买 nike

我已经为我的 spring/hibernate 项目配置了一个自定义通用服务 DAO - 我的想法是我可以从我的 Controller 中轻松地重用它。

它基本上是这样的:

public class DefaultService<T> {

private Class<T> e;

public String className(Class<T> e) {
String clip = e.getName();
clip = clip.substring(clip.lastIndexOf('.') + 1, clip.length());
return clip;
}
public List<T> getAll(Integer status) {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("FROM " + className(e) + " WHERE status = " + status);
return query.list();
}
...

它被引用:

@Autowired
public DefaultService<Address> addressService;
addressService.get(1);

但是 String clip = e.getName() 行抛出空指针异常。如果我将类移动到属性部分(所以 addressService.get(Address.class, 1) ),我可以让它工作,但我发现这有点不整洁,特别是当有多个不同的类被调用时

有没有什么方法可以让类正确生成一个值,而无需将它重复添加到我的所有函数中?

提前致谢。

最佳答案

我做了类似的事情,你也需要泛型类作为构造函数参数,我的使用 hibernate 实体,但你可以传入表名字符串。

public class DomainRepository<T> {

@Resource(name = "sessionFactory")
protected SessionFactory sessionFactory;

public DomainRepository(Class genericType) {
this.genericType = genericType;
}

@Transactional(readOnly = true)
public T get(final long id) {
return (T) sessionFactory.getCurrentSession().get(genericType, id);
}

然后您可以子类化(如果需要)以自定义或简单地在 spring 配置中设置您的 bean,如下所示:

<bean id="tagRepository" class="com.yourcompnay.data.DomainRepository">
<constructor-arg value="com.yourcompnay.domain.Tag"/>
</bean>

因此在您的代码中您可以像这样引用 tagRepository(除了上面和下面发布的代码之外不需要其他代码):

@Resource(name = "tagRepository")
private DomainRepository<Tag> tagRepository;

此外,我将其称为存储库而不是服务,服务处理不同类型及其交互(不仅仅是一个)。对于使用 SQL 字符串的具体示例:

public final String tableName;
public DomainRepository(String tableName) {
this.tableName = tableName;
}
public List<T> getAll(Integer status) {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("FROM " + tableName + " WHERE status = " + status);
return query.list();
}

然后像这样定义你的bean

<bean id="addressRepository" class="com.yourcompnay.data.DomainRepository">
<constructor-arg value="address"/>
</bean>

然后你也可以在需要的时候自己创建子类:

public class PersonRepository extends DomainRepository<Person> {
public PersonRepository(){
super("person"); //assumes table name is person
}

关于java - Spring Generic Dao 类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15002836/

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