Function 类函数困境

Function 类函数困境,function,class,architecture,model,Function,Class,Architecture,Model,我正在做一个项目,偶然发现了一个非常常见的问题 “我应该将此函数放置在何处?” 基本上我有一些表示模型的类,比如 Store, Area, User, Item, Menu, Product and more... 我只是在考虑一些基本功能,比如CRUD和其他搜索功能 我在网上的教程和示例中看到的大部分内容是 User.create(), User.delete(), User.update() and User.getUserById(int Id) User.getAllUsers() s

我正在做一个项目,偶然发现了一个非常常见的问题

“我应该将此函数放置在何处?”

基本上我有一些表示模型的类,比如

Store, Area, User, Item, Menu, Product and more...
我只是在考虑一些基本功能,比如CRUD和其他搜索功能

我在网上的教程和示例中看到的大部分内容是

User.create(), User.delete(), User.update() and User.getUserById(int Id) User.getAllUsers() so on..
我的问题是这对我来说毫无意义

为什么用户模型能够搜索所有用户?或者甚至创建一个新用户

更新和删除可能更有意义,但getUserById和getAllUsers也没有意义

我想的是,商店模型是否有责任在该商店中添加用户,或者在该商店中创建菜单、项目和区域,然后菜单模型是否有责任在其菜单中添加产品等等

然后,当搜索用户时,对于Store.getAllUsers()或Store.getUserById()或类似于Menu.getAllCategories()和Category.getAllProducts()的东西不是更有意义吗

我知道我所想的需要更多的代码和功能,但我不确定我所想的是不是一个合理的架构,但我觉得是的


我需要一些指导,或者可能是一记重击,让自己思考清楚。

在决定如何将persistence应用到web应用程序中之前,您可能需要掌握一些概念。在我看来,有许多不同的设计模式,没有一种一刀切的解决方案。正确的答案应该是语言不可知,但请允许我举例说明您可能希望使用基本Java实现遵循的一种可能的设计:

基本上,您创建了一个在应用程序中实现持久性()的应用程序

此DAO将应用程序调用映射到持久层。这里我在Java上使用()作为:

了解ORM如何处理数据库查询/查询结果对象转换的细节,其思想是通过在查询中使用使应用程序数据库不可知。MySQL?神谕PostgreSQL?SQLite?谁在乎呢?设置您想要/需要的数据源,代码保持不变(通常您只需使用带有适当驱动程序的JDBC)

下面是一个用于实例化用户对象(例如getUser在DAO上返回的对象)的非常简单的实现示例;只是一个getter和setter的集合,没有约束检查或任何东西(也可以检查下面的示例):

这里是它的User.hbm.xml Hibernate映射,在这个简单的例子中,您只需指定用户类中的哪个属性与哪个表和列匹配(还可以查看下面的示例):


所以现在你可以通过id选择用户,获得用户列表。。。不管你想做什么,你只要在这些类和DAO上实现它,然后在你的应用程序需要它们的任何地方导入它们,然后你就可以设置它们了

最重要的是:如果您想避免这些任务,有许多IDE和框架可以为您自动处理这个过程。e、 g.看看在这个平台上使用Java在模型中添加/修改一个或多个实体的参数有多容易;或者像你在他们的教程中看到的那样,python如何很好地处理模型和应用程序之间的所有交互:以及

package org.mywebapp.pojos;

import org.hibernate.Query;
import org.hibernate.Session;

import java.io.Serializable;
import java.util.List;

public class myWebAppDAO {
    private static myWebAppDAO _this = new myWebAppDAO();

    public static myWebAppDAO getInstance() {
        return _this;
    }

    public void persist(Object object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.persist(object);
        session.getTransaction().commit();
        session.disconnect();
    }

    public void update(Object object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.update(object);
        session.getTransaction().commit();
        session.disconnect();
    }

    public void delete(Object object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.delete(object);
        session.getTransaction().commit();
        session.disconnect();
    }

    public Object getById(Class clazz, Serializable id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Object o = session.load(clazz, id);
        session.getTransaction().commit();
        session.disconnect();
        return o;
    }

    public List getTopicsByRef(int ref) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q = session.createQuery("from Topic AS t WHERE t.ref = :ref");
        q.setParameter("ref", ref);
        List topic = q.list();
        session.getTransaction().commit();
        return topic;
    }

    public long getTopicCount(int ref) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q = session.createQuery("SELECT COUNT(t) FROM Topic AS t WHERE t.ref = :ref");
        q.setParameter("ref", ref);
        Long l = (Long) q.uniqueResult();
        session.getTransaction().commit();
        return l;
    }

    public User getUser(String email, String password) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q = session.createQuery("from User AS e WHERE e.email = :email AND e.password = :password");
        q.setParameter("email", email);
        q.setParameter("password", password);
        User user = (User) q.uniqueResult();
        session.getTransaction().commit();
        return user;
    }

//...

}
package org.mywebapp.pojos;

import java.io.Serializable;

public class User
        implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String email;
    private String password;
    private String firstName;
    private String lastName;

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="org.mywebapp.pojos.User" table="user">
        <id name="id" column="id">
            <generator class="uuid" />
        </id>
        <property name="email" column="email"/>
        <property name="firstName" column="firstName"/>
        <property name="lastName" column="lastName"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>