gpt4 book ai didi

java - Hibernate无法正确写入数据到mysql

转载 作者:行者123 更新时间:2023-11-29 23:29:16 25 4
gpt4 key购买 nike

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

最佳答案

据此:

@novy154 I am trying to make e record to DB with the users IP, user-agent info and the time when the user was lastloged in the app. After that i want to display all records in the app.

首先,您需要有一些DataAccessLayer。类似的东西

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

及其实现。

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

您需要将存储库注入(inject) Controller 并且:

1) 调用userInfoRepository.save(newlyCreatedUserInfo)

2) 将所有 UserInfo 传递到您的 View (通过调用 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();
}
}

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

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

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

当然记得

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

在 Controller 中。

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

关于java - Hibernate无法正确写入数据到mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26688104/

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