恐怖的Hibernate和JavaFX Table CallBack!
目录 [隐藏]
Hibernate
最近在做 JavaFX 应用,不管再怎么避免数据持久化,但面对几十万的数据量的时候也只能乖乖的去配置持久层框架了。
一开始打算还是使用Mybatis,我在做Web的时候就是一只用Mybatis框架,而Mybatis-plus的强大构造器用着也非常顺手,可是JavaFX如果使用Mybatis-plus就必须要代码生成器,那太麻烦了,不干。
而mybatis原生框架又太原生了,加上配置出一肚子火,换Hibernate!
虽然之前没用过,但Hibernate早在我刚学Java的时候就已经是如雷灌耳了,而且是一个自带Sql构造器的全自动持久层框架,觉得比Mybatis更加稳定。
接着就是配置,Maven中引入:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.2.Final</version>
</dependency>
接着是XML配置文件:
<!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.cj.jdbc.Driver</property><!-- 引用jdbc包 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/bbs?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&nullCatalogMeansCurrent=true</property> <!-- 数据库链接 -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- <property name="hibernate.connection.username">root</property>-->
<!-- <property name="hibernate.connection.password">1234</property>-->
<property name="hibernate.format_sql">true</property>
<property name="hibernate.show_sql">true</property>
</session-factory>
</hibernate-configuration>
至于实体类和映射文件直接用IDEA生成,太特么爽了!
接着,两个异常让我搞了半天。
1.no entity found for query
2.MappingNotFoundException: resource:**.hbm.xml not found
网上了博客答案没什么新意,解决不了我的问题。
最终,第一个问题是:
List<HupuOriginEntity> hupuOriginEntities = session.createQuery("from xyz.chaojie.db.HupuOriginEntity").list();
要加包名。
第二个:
Entity.hbm.xml 文件放在resouce文件夹中!
JavaFX Table
我只是想让JavaFX的Table多一个操作列,加一个可以删除一行数据的按钮。
这代码量和逻辑令我十分害怕。
Callback<TableColumn<HupuOriginEntity, String>, TableCell<HupuOriginEntity, String>> callback = new Callback<TableColumn<HupuOriginEntity, String>, TableCell<HupuOriginEntity, String>>() {
@Override
public TableCell<HupuOriginEntity, String> call(TableColumn<HupuOriginEntity, String> param) {
Button jfxButton = new Button("删除");
jfxButton.getStyleClass().add("danger");
return new TableCell<HupuOriginEntity, String>() {
Button btn = jfxButton;
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
setText(null);
} else {
btn.setOnAction(event -> {
Dialog dialog = new Dialog(
DialogType.CONFIRMATION,
DialogStyle.UNDECORATED,
"信息",
"确定删除?");
dialog.showAndWait();
HupuOriginEntity delEntity = getTableView().getItems().get(getIndex());
if (dialog.getResponse() == DialogResponse.YES) {
Transaction transaction = session.beginTransaction();
session.delete(delEntity);
transaction.commit();
reloadTable();
}
});
setGraphic(btn);
setText(null);
}
}
};
}
};