我想获取已插入实体的自动生成ID到MySQL,我有一个用javafx和hibernate制作的应用程序,我不能删除实体,因为ID是自动生成的,我必须得到id实体,所以在我将它保存到数据库后,然后写入用户名和密码我希望它给我输入用户名和密码的ID。请说我已插入实体USERNAME:123,密码:asd,然后它会自动生成ID:1。现在如果我在域名中输入用户名:123,密码:asd并单击删除按钮,它应该删除该实体..但是它已经...所以我需要得到它的ID并按ID删除,我不知道如何。
public class TestMain extends Application {
static Employee m = new Employee();
public static void main(String[] args) { launch(args); }
@Override
public void start(Stage primaryStage) throws Exception {
// TODO Auto-generated method stub
Stage window = primaryStage;
window.setTitle("WELCOME");
Label l1 = new Label();
// l1.setFont(new Font(48));
l1.setText("SMS");
l1.setTranslateY(-180);
Button closeBut = new Button("Exit.");
closeBut.setTooltip(new Tooltip("Click to exit application"));
closeBut.setOnAction(e -> window.close());
Button save = new Button ("Save");
save.setTooltip(new Tooltip("Click to save to database"));
Label l2 = new Label("Username ");
TextField username = new TextField();
username.setTooltip(new Tooltip("Enter your new username"));
username.setPromptText("username");
GridPane.setConstraints(l2,0,0);
GridPane.setConstraints(username,1,0);
Label l3 = new Label("Password ");
PasswordField password = new PasswordField();
password.setTooltip(new Tooltip("Enter your new password"));
password.setPromptText("password");
GridPane.setConstraints(l3,0,1);
GridPane.setConstraints(password,1,1);
Label l4 = new Label();
GridPane.setConstraints(l4,0,4);
GridPane.setConstraints(save,0,2);
GridPane.setConstraints(closeBut,1,2);
//Configureation Hibernate
// Configuration config = new Configuration();
//config.configure("hibernate.cfg.xml");
SessionFactory sf = new Configuration().configure().buildSessionFactory();
//
save.setOnAction(e -> {
m.setUser(username.getText());
m.setPassword(password.getText());
Session session = sf.openSession();
session.beginTransaction();
session.delete(m);
session.getTransaction().commit();
});
GridPane grid = new GridPane();
grid.setPadding(new Insets(10,10,10,10));
grid.setVgap(8);
grid.setHgap(0);
grid.getChildren().addAll(l1,l2,username,l3,password,save,l4,closeBut);
grid.setAlignment(Pos.CENTER);
Scene scene = new Scene(grid,300,400);
window.setScene(scene);
window.show();
}
}
java类员工:
package mypackage;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.*;
import javax.persistence.Id;
@Entity(name="EMPLOYEE")
public class Employee {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private int Id;
@Column(name="USERNAME")
private String user;
@Column(name="PASSWORD")
private String password;
public int getId() {
return Id;
}
public void setId(int Id) {
this.Id = Id;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
答案 0 :(得分:1)
就像你说的那样,我会选择一个单独的按钮,而不是混合物。
所以你的保存行动将是:
save.setOnAction(e -> {
m.setUser(username.getText());
m.setPassword(password.getText());
Session session = sf.openSession();
session.beginTransaction();
session.save(m);
session.getTransaction().commit();
您的删除操作将是:
delete.setOnAction(e -> {
Session session = sf.openSession();
Transaction tx;
try{
tx = session.beginTransaction();
Query query = session.createQuery("from Employee where user = :user and password = :password");
query.setString("user", username.getText());
query.setString("password", password.getText());
Employee userToDelete = (Employee)query.uniqueResult();
session.delete(userToDelete );
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
session.close();
}
答案 1 :(得分:1)
此处的关键是session.save(m);
语句的返回值。
它将返回存储的实体(包括生成的密钥),然后您可以再次使用它来删除它
m = session.save(m);
...
session.delete(m);
答案 2 :(得分:1)
根据我的说法,你必须使用Hibernate中的ID生成器,因此对于每次插入,你将得到ID值,它将是数字。通过查询该ID,您可以稍后删除该记录。
对于id生成器,你必须在数据库中再添加一列,并且每次插入和更新都会自动填充hibernate。
如果我错了,请纠正我。