当前位置: 首页 > 知识库问答 >
问题:

Hibernate不基于实体创建表

微生俊名
2023-03-14

启动程序(启动TomCat)后,模式中没有创建表,但是必须自动创建表“player”。

我检查了Hibernate配置,但找不到问题所在。我尝试将hbm2ddl.auto更改为hibernate.hbm2ddl.auto(也包括创建、创建-删除等),但没有帮助。

如果有什么想法,请告诉我。谢了。

实体类:

package com.game.entity;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(schema = "rpg", name = "player")
public class Player {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "name", length = 12, nullable = false)
    private String name;
    @Column(name = "title", length = 30, nullable = false)
    private String title;
    @Column(name = "race", nullable = false)
    @Enumerated(EnumType.ORDINAL)
    private Race race;
    @Column(name = "profession", nullable = false)
    @Enumerated(EnumType.ORDINAL)
    private Profession profession;
    @Column(name = "birthday", nullable = false)
    private Date birthday;
    @Column(name = "banned", nullable = false)
    private Boolean banned;
    @Column(name = "level", nullable = false)
    private Integer level;

    public Player() {
    }

    public Player(Long id, String name, String title, Race race, Profession profession, Date birthday, Boolean banned, Integer level) {
        this.id = id;
        this.name = name;
        this.title = title;
        this.race = race;
        this.profession = profession;
        this.birthday = birthday;
        this.banned = banned;
        this.level = level;
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Race getRace() {
        return race;
    }

    public void setRace(Race race) {
        this.race = race;
    }

    public Profession getProfession() {
        return profession;
    }

    public void setProfession(Profession profession) {
        this.profession = profession;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Boolean getBanned() {
        return banned;
    }

    public void setBanned(Boolean banned) {
        this.banned = banned;
    }

    public Integer getLevel() {
        return level;
    }

    public void setLevel(Integer level) {
        this.level = level;
    }
}

存储库类:

package com.game.repository;

import com.game.entity.Player;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.NativeQuery;
import org.springframework.stereotype.Repository;
import javax.annotation.PreDestroy;
import java.util.List;
import java.util.Optional;

@Repository(value = "db")
public class PlayerRepositoryDB implements IPlayerRepository {

    private final SessionFactory sessionFactory;

    public PlayerRepositoryDB() {
        Configuration configuration = new Configuration().configure().addAnnotatedClass(Player.class);
        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    }

    @Override
    public List<Player> getAll(int pageNumber, int pageSize) {
        try(Session session = sessionFactory.openSession()){
            NativeQuery<Player> nativeQuery = session.createNativeQuery("SELECT * FROM rpg.player", Player.class);
            nativeQuery.setFirstResult(pageNumber * pageSize);
            nativeQuery.setMaxResults(pageSize);
            return nativeQuery.list();
        }
    }

Hibernate配置:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="connection.url">jdbc:mysql://localhost:3306/rpg</property>
    <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
    <property name="connection.username">root</property>
    <property name="connection.password">1234</property>
    <property name="hbm2ddl.auto">update</property>
    <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
    <property name="show_sql">true</property>
    <property name="hibernate.current_session_context_class">thread</property>
  </session-factory>

</hibernate-configuration>

pom.xml的完整项目代码可通过链接:https://github.com/gamlethot/project-hibernate-1获得

共有1个答案

燕禄
2023-03-14

Hibernate无法识别您的存储库。数据库存储库类正在实现< code>IPlayerRepository,但它必须标记为< code>@Repository,并且它应该扩展< code>CrudRepository或< code > jpare Repository (它已经扩展了CrudRepository)。

喜欢:

public interface IPlayerRepository extends JpaRepository<Player, Long>

这里,LongPlayer类的主键类型。

注意:我不确定是否将该类标记为@Repostory。尝试使用它或不放置任何注释,或者尝试将IPlayerRepostory标记为@NoRepositoryBean在它之上

 类似资料:
  • 问题内容: 我有以下实体类(在Groovy中): and my persistence.xml: and the script: 数据库Icarus存在,但当前没有表。我希望Hibernate基于实体类自动创建和/或更新表。我将如何完成? 问题答案: 我不知道离开前线是否会有所作为。 该参考表明,它应该是 值为将会在创建时创建表,并保持它们不变。 值为会创建你的表,然后在关闭sessionFact

  • 我需要创建一个GETendpoint来返回通过超文本传输协议客户端从另一个应用程序获取的资源,而不是基于实体。我获取的资源是一个数组: 然后我需要查询数据库以获取一些数据以添加到资源数组中。 所以我在中创建了它: 但是现在,我希望我的api返回json api响应格式:https://jsonapi.org/. 基于实体的资源,api平台完全支持。我不需要做太多。我只是在实体类中添加“key”并配

  • 问题内容: 我有一个包含CREATE TABLE命令的sql / ddl脚本。 我使用hibernate模式,并且希望hibernate模式执行此脚本以创建数据库结构。 这个怎么做? 问题答案: 如果使用Spring,则可以使用其JDBC实用程序填充数据库:

  • 问题内容: 我有以下实体类(在Groovy中): 和我的persistence.xml: 和脚本: 数据库 Icarus 存在,但当前没有表。我希望Hibernate基于实体类自动创建和/或更新表。我将如何完成? 问题答案: 我不知道离开前线是否会有所作为。 该参考表明,它应该是 值为将会在创建sessionFactory时创建您的表,并保持它们不变。 值为会创建您的表,然后在关闭sessionF

  • Java类可以很容易地转换成实体。 对于实体转换,基本要求是 - 无参数构造函数 注解 在这里,我们将学习如何通过示例,学习将常规Java类转换为实体类 - 简单的一个学生类(Student),代码如下 - 上面的类是一个常规的java类,有三个属性: , 和 。要将此类转换为实体,请在此类中添加和注解。 - 这是一个标记注释,表明这个类是一个实体。这个注释必须放在类名称上。 - 此注释位于持有持

  • 我正在使用在Hibernate中指定映射设置。也就是说,我正在使用EntityManager类获取事务。 现在,我的中列出了以下类 另外,在我的Eclipse项目中,我还有两个类(student.java和user.java),它们用注释标记,但没有在文件中列出。 但当我运行我的项目时,Hibernate实际上也映射了这两个类。我的意思是,它还为这两个类创建数据库表(我将设置为)。 它为什么要这样