【问题标题】:Hibernate can not write data to mysql correctlyHibernate 无法正确向 mysql 写入数据
【发布时间】:2014-12-28 13:35:38
【问题描述】:

我正在尝试写一些关于打开我制作的 Web 应用程序的用户的信息。网络应用程序很简单。打开它时,它会显示用户 ip、用户代理和上次登录应用程序的时间。我使用以下技术制作了这个应用程序:Spring、Maven、Tomcat、Hibernate 和 MySQL。似乎一切正常,但是当我在浏览器中打开应用程序时,请注意向数据库记录,我必须手动启动 Main.java 进行记录,但记录不正确,因为它没有记录真实信息但它到处都记录NULL。我有两个问题 - 如何自动执行所有这些操作(当我打开 Web 应用程序以在 DB 中记录时)以及为什么我的记录每次都是 NULL。

public class Main {

    public static void main(String[] args) {

        UserInfo user = new UserInfo();
        user.setRollNo(7);
        user.setIp(UserController.ip);
        user.setUserAgent(UserController.userAgent);
        user.setDate((Date) UserController.date);

        SessionFactory sessionFactory = new AnnotationConfiguration()
                .configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        session.save(user);

        session.getTransaction().commit();
        session.close();
    }
}

UserController.java

   @Controller
    public class UserController {

        public static String ip;
        public static String userAgent;
        public static Date date;

        @Autowired
        private HttpServletRequest request;

        @RequestMapping(value = "/connection")
        public ModelAndView getUserInfo() {

            ModelAndView modelandView = new ModelAndView("UserInfo");

            ip = request.getRemoteAddr();
            modelandView.addObject("msg1", "Your IP is " + ip);

            userAgent = request.getHeader("User-Agent");
            modelandView.addObject("msg2", "Your User agent is " + userAgent);

            date = new java.util.Date();
            /*
             * Calendar calendar = Calendar.getInstance(); java.sql.Date startDate =
             * new java.sql.Date(calendar.getTime() .getTime());
             */
            modelandView.addObject("msg3", "Your last log was at " + date);

            return modelandView;

        }

    }

用户信息.java

@Entity
@Table(name = "USER_INFORMATION")
public class UserInfo {

    @Id
    private int rollNo;
    private String ip;
    private String userAgent;
    private Date date;

    public int getRollNo() {
        return rollNo;
    }

    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getUserAgent() {
        return userAgent;
    }

    public void setUserAgent(String userAgent) {
        this.userAgent = userAgent;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

}

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/browserinfo</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>

        <property name="connection.pool_size">1</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <property name="show_sql">true</property>

        <property name="hbm2ddl.auto">validate</property>

        <mapping class="com.nikola.hellocontroller.UserInfo" />

    </session-factory>
</hibernate-configuration>

【问题讨论】:

  • 我不明白你的问题。你想达到什么目标?您想从数据库中获取一些数据并将其显示在视图中吗?或者也许创建新用户并将其存储在数据库中?你想在没有任何数据访问层的情况下如何实现这一点?
  • 你执行“记录”的方式真的很奇怪。为什么要将来自getUserInfo 的信息存储在static 变量中?它们将被每个请求覆盖。是的,您必须手动触发main 方法,因为您的数据库处理只在那里。如果您不首先访问/connection,则数据库条目将包含null。现在我想知道如果你不想这样做,为什么你要那样实现它。
  • 在这个例子中使用数据库的目的是什么?您正在从请求中检索用户信息,然后呢?您想创建新用户并将其存储在数据库中吗?接下来呢?从数据库中检索它?通过什么方式?按你不知道的主键?
  • @novy154 我想记录一些数据,然后显示出来查看。 @Tom 我现在正在学习这项技术。我决定在这里制作一个主题,因为我需要一些帮助.. 我还是菜鸟。如果您有时间向我解释如何解决这个问题,我将不胜感激。
  • @novy154 我正在尝试使用用户 IP、用户代理信息和用户上次登录应用程序的时间将电子记录到数据库。之后我想在应用程序中显示所有记录。

标签: java mysql spring hibernate maven


【解决方案1】:

据此:

@novy154 我正在尝试使用用户 IP、用户代理信息和用户上次登录应用程序的时间将 e 记录到数据库。之后我想在应用程序中显示所有记录。

首先,你需要有一些DataAccessLayer。像

public interface UserInfoRepository {
    void save(UserInfo userInfo);
    Collection<UserInfo> findAll();
}

它的实现。

然后可能会在存储库上提供一些服务,但在这种情况下并不重要,所以让我们跳过它。

您需要将您的存储库注入控制器并且:

1) 调用userInfoRepository.save(newlyCreatedUserInfo)

2) 将所有 UserInfos 传递给您的视图(通过调用 userInfoRepository.findAll() 并将结果放入 modelAndView)并以某种方式显示它。

如果您需要帮助来实现这一点,请告诉我。

但这只是为了学习如何制作简单的类似 crud 的应用程序,因为这没有任何意义。您甚至无法识别您的用户,您只想跟踪每个访问者的 ip、用户信息等。

// 编辑: 存储库实现类似于:

@Repository
@Transactional
public class UserInfoRepositoryImpl implements UserInfoRepository {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void save(UserInfo userInfo) {
        getCurrentSession.save(userInfo);
    }

    @Override
    public Collection<UserInfo> findAll() {

        final Criteria root = getCurrentSession().createCriteria(UserInfo.class);
        return Collections.checkedList(root.list(), UserInfo.class);
    }

    private Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }
}

然后在您的控制器方法中,您需要调用save(newlyCreatedUserInfo) 以将您的信息存储在数据库中并

modelAndView.addObject("userInfos", repository.findAll());

检索所有数据并将其传递给视图。

当然记得

...
@Autowired
private UserInfoRepository userInfoRepository;
...

在控制器中。

请注意,由于 spring-data-jpa 为您提供了更强大的开箱即用存储库,因此这是在重新发明轮子。

【讨论】:

  • 我不想识别用户。我想让它变得最简单。我想在数据库中记录所有用户信息(ip、user-agent ..)并显示它。目前我不想为用户进行注册和识别。
  • 然后实现某种数据访问层是要走的路。
  • 请你给我一个例子来理解如何做到这一点,因为我的脑海里非常混乱... :(
猜你喜欢
  • 2015-10-26
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多