【问题标题】:How can I insert new row in a table using Hibernate?如何使用 Hibernate 在表中插入新行?
【发布时间】:2019-03-06 20:04:10
【问题描述】:

我正在尝试了解 JPA/Hibernate,我能够创建新数据库,但我不明白如何在我的 数据库。 这是代码:

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String adress;
    private String phoneNumber;

    public void setName(String name) {
        this.name = name;
    }

    public void setAdress(String adress) {
        this.adress = adress;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public String getAdress() {
        return adress;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

   @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Person)) {
            return false;
        }
        Person other = (Person) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entinty.Person[ id=" + id + " ]";
    }


}

创建数据库的类是:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

public class Main {

    public static void main(String args[]) {

        Person p = new Person();
        p.setName("xxx");
        p.setAdress("yyy");
        p.setPhoneNumber("zzz");
        EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("testPU");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        try {
            em.persist(p);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        }

        em.close();
        emf.close();



    }

}

此时我有一个单行表(写有“xxx-yyy-zzz”)。如何添加新行?创建新人不起作用,因为它会创建新表......我只找到使用 Session 和 SessionFactory 的解决方案,但我无法使用它,因为我不明白如何生成 hibernate.cfg.xml (以及一般如何创建会话对象)。 是否有仅使用 EntityManager 的解决方案?或者如何生成/编写 hibernate.cfg.xml 文件?有没有办法使用netbeans自动生成它?

编辑:这是我的 persistence.xml 文件。我必须把它放在哪里?我把它放在***区但它不起作用......

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>test.Person</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/stackoverflow?zeroDateTimeBehavior=convertToNull"/>
      <property name="javax.persistence.jdbc.user" value="root"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.password" value="leonida95."/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
    *****
    </properties>
  </persistence-unit>
</persistence>

【问题讨论】:

  • 生成了哪些表?
  • em.persist如何重新创建表?此代码甚至适用于多个持久化。
  • 一张桌子,名字为 xxx,地址为 yyy,电话为 zzz。如何插入名称为 aaa 地址 bbb 和电话 ccc 的行? (如果我尝试创建一个人 p2 并运行 em.persist(p); em.persist(p2) 我得到一个错误,因为已经存在一个表“Person”。

标签: java mysql database hibernate


【解决方案1】:

在您的 Persistence Unit 文件中,您将拥有类似

<properties>
   <property name="hibernate.connection.url" value="..." />
   <property name="hibernate.connection.driver_class" value="..."/>
   ...
</properties>

要在构造EntityManagerFactory时创建表,只需添加

<property name="hibernate.hbm2ddl.auto" value="create" />

您的代码运行良好。
您可以根据需要多次调用persist,它会将行添加到目标表中。

em.persist(person1);
em.persist(person2);
...

persist 不创建表。

【讨论】:

  • 我正在尝试,但它不起作用...我在 EDIT 中发布了 persistence.xml 文件,您能帮帮我吗?
  • 你能发布失败的代码吗?我的意思是,您调用的代码会多次保留。
  • 在persistence.xml中添加你的行会产生这个错误线程“main”中的异常javax.persistence.PersistenceException:无法执行JPA模式生成创建命令[create table Person(id bigint not null auto_increment, adress varchar(255), name varchar(255), phoneNumber varchar(255), primary key (id))] 原因:java.sql.SQLSyntaxErrorException: 表'person'已经存在。
  • 哦等等。现在它工作了。可能我犯了一些错误,忘记了一些东西。不知道。非常感谢。
  • @MicheleBattagliola 并记得在“表 3.7. Miscellaneous Properties”下查看有关 hbm2ddl.auto docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html 的 Hibernate 文档
猜你喜欢
  • 2014-04-23
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多