Java Hibernate在插入用户名和密码时获取实体的id并删除它

时间:2017-03-06 10:00:32

标签: java mysql hibernate jpa

我想获取已插入实体的自动生成ID到MySQL,我有一个用javafx和hibernate制作的应用程序,我不能删除实体,因为ID是自动生成的,我必须得到id实体,所以在我将它保存到数据库后,然后写入用户名和密码我希望它给我输入用户名和密码的ID。请说我已插入实体USERNAME:123,密码:asd,然后它会自动生成ID:1。现在如果我在域名中输入用户名:1​​23,密码: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;
    }
    }

3 个答案:

答案 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。

如果我错了,请纠正我。