我正在构建一个使用Hibernate
和Mysql
的应用程序,我的整个数据库都有15
个表。
问题在于:我开始在数据库中插入记录并使用query.list();
查看记录,以获取添加的记录,在获得"正确"结果,我开始没有我添加的最后一条记录,我再次添加,它是相同的(显示之前显示的那个,但不是我添加的最后一个),我刷新,我得到正确的记录,我再次刷新,我得到的是32
个记录,而不是43
,我没有使用任何复杂的查询只是Select
条件,因为你可以看到这真的很奇怪。< / p>
请注意,我保存对象然后进行imidiately抓取,因此插入后直接进行选择(我不知道这是否会导致Mysql出现问题),记录也会添加到完全数据库,使用Mysql workbench
我可以看到我的记录被正确地添加到数据库中,我真的希望有人能够帮助我调试这个,因为我没有得到任何错误。
我正在使用Hibernate 4.3.10
和java版1.8.0_131
这是一段代码,有时&#34;从我使用的某个实体获取结果时,我遇到了问题:
获取产品列表:
public static List<Product> productsList() {
//singleton factory object
SessionsGenerator FactoryObject = new SessionsGenerator();
Session session = SessionsGenerator.getFactory().openSession();
List<Product> list = new ArrayList<>();
try {
list = session.createQuery("from Product where deleted= false").list();
System.out.println("-------------- list product: "+list); // testing from console here I get the same results on the user interface, so it can't be a Javafx problem.
} finally {
session.close();
}
return list;
}
插入产品的代码:
public static boolean SaveOrUpdate(Product product) {
SessionsGenerator FactoryObject = new SessionsGenerator();
Session session = SessionsGenerator.getFactory().openSession();
try {
session.beginTransaction();
session.saveOrUpdate(product);
session.getTransaction().commit();
} catch (Exception e) {
return false;
} finally {
session.close();
return true;
}
}
以下是Product实体类:
@Entity
@Table(name = "Product")
public class Product{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
int id;
@Column(name = "code", nullable = false)
String code;
@Column(name = "matricule", nullable = false)
String matricule;
@Column(name = "marque", nullable = false)
String marque;
@Column(name = "type", nullable = false)
String type;
@OneToMany(targetEntity = Facture.class, mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Facture> factures;
@OneToMany(targetEntity = Achat.class, mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Achat> achats;
@Column(name = "deleted", nullable = false)
boolean deleted;
public Product() {
}
public Product(String code, String matricule, String marque,String type) {
this.code = code;
this.matricule = matricule;
this.marque = marque;
this.type = type;
this.deleted = false;
}
//setters and getters
这是我的hibernate配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/gestioncommerciale</property>
<property name="connection_pool_size">1</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
编辑:我尝试session.flush()
和session.clear()
,因为我虽然问题与兑现有关,但我仍然遇到同样的问题,我开始认为这是一个问题使用Mysql Workbench
服务器。
已经有五天了,我无法相信整个stackoverflow社区中没有人对此有任何想法,这和我遇到的问题一样奇怪。
答案 0 :(得分:0)
我认为随机结果是由于您的select语句缺少事务边界。 根据这个hibernate doc,你应该
始终使用明确的事务边界,即使是只读操作
尝试更改代码并检查结果。
Transaction tx = null;
try {
tx = session.beginTransaction();
list = session.createQuery("from Product where deleted= false").list();
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
} finally {
session.close();
}
详细讨论可以是found here
答案 1 :(得分:0)
这种情况确实很奇怪。乍一看,代码似乎很好,我没有看到你如何获取数据的任何问题。
您提到您在开始时收到了正确的答案,但过了一段时间后又返回了错误的数据。
我认为这是因为您每次都在创建一个新会话,并且一旦完成就不会实际关闭它。
基本上,改变这个:
SessionsGenerator.getFactory().openSession();
致:
SessionsGenerator.getFactory().getCurrentSession();
使用openSession()时,需要显式刷新并关闭对象。这可能是您遇到问题的原因。
getCurrentSession()如果不存在则会打开一个新会话,并且一旦完成就会自动刷新并关闭会话。
另外,将它添加到你的hibernate.cfg.xml
中<session-factory>
<!-- Put other elements here -->
<property name="hibernate.current_session_context_class">
thread
</property>
</session-factory>
否则,您将发生异常,因为您尚未配置为正确使用getCurrentSession。
此外,请尝试拨打
session.flush();
session.close();
相反,如果你不想采取上述方法。
希望这可以解决问题!