Hibernate无法正确地将数据写入mysql

时间:2014-11-01 10:00:53

标签: java mysql spring hibernate maven

我正在尝试编写有关打开我所创建的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;

        }

    }

UserInfo.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>

1 个答案:

答案 0 :(得分:0)

根据这个:

  

@ novy154我正在尝试使用用户IP,用户代理信息以及用户在应用程序中上次使用的时间来向数据库创建电子记录。之后我想在应用程序中显示所有记录。

首先,您需要一些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为您提供了更强大的开箱即用存储库,因此重新发明了一个轮子。