hibernate不创建表

fjnneemd  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(368)

我想使用hibernate从java对象创建表,但出现以下错误:
org.hibernate.exception.sqlgrammareexception:无法在database.starter.main(starter)上执行语句<27 internal call>。java:51)<5内部调用>原因:java.sql.sqlsyntaxerrorexception:表“cube.products”不存在
它不应该给我这个错误,因为表不应该在那里。下面是我的hibernate.cfg.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="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/cube</property>
    <property name="connection.username">user</property>
    <property name="connection.password">pass</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.hbm2ddl.auto">create</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>

    <mapping class="database.Product" />

    </session-factory>
    </hibernate-configuration>

下面是我的产品类(没有getter和setter,避免插入太多代码):

package database;

import javax.persistence.*;

@Entity
@Table(name = "products")
public class Product {
    @Id
    @Column(name = "product_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name", length = 128, nullable = true, unique = false)
    private String name;

    @Column(name = "price", precision = 10, scale = 2)
    private float price;

    @Column(name = "enabled", columnDefinition = "tinyint default 1")
    private boolean enabled;

    @Column(length = 512, nullable = true)
    private String description;

下面是名为starter的主类:

package database;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import java.util.List;

public class Starter {
    public static void main(String args[]) {
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure("hibernate.cfg.xml")
                .build();
        try {
            SessionFactory factory = new MetadataSources(registry)
                    .buildMetadata().buildSessionFactory();
            Session session = factory.openSession();
            Transaction transaction = session.beginTransaction();

            Product product = new Product();
            product.setName("iPhone 7 Plus");
            product.setDescription("A good smartphone");
            product.setPrice(1299.89f);
            product.setEnabled(true);

            session.save(product);

            transaction.commit();

            session.close();
            factory.close();

        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
            StandardServiceRegistryBuilder.destroy(registry);
        }

    }

}

我希望有人能帮我,因为我真的不知道该多尝试些什么。我问这个问题是为了分散注意力。

7nbnzgx9

7nbnzgx91#

我解决了,问题是我的hibernate.cfg.xml的一个属性,来自:

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

对此:

<property name="dialect">org.hibernate.dialect.MariaDBDialect</property>

总的来说,我试图不保存产品,它给了我另一个sql错误,帮助我找到了哪里出了问题。

p4rjhz4m

p4rjhz4m2#

当您看到行

<property name="connection.url">jdbc:mysql://localhost:3306/cube</property>

这意味着您的计算机上安装了一个名为“cube”的数据库。你在这么做吗?
如果您的计算机上运行着数据库,那么您应该检查是否创建了名为“products”的表
错误出现在尝试访问表cube.products时
所以在你的产品课上,
使用注解时 @Table(name="products") 这意味着您已经有了一个表。所以你应该试着
首先运行代码来创建表
使用hibernate crud操作运行项目

相关问题