如何解决休眠状态:架构验证:即使在休眠状态刚生成表后,表仍会丢失
每当我尝试将hibernate.hbm2ddl.auto设置为“ validate”连接到我的数据库时,都会出现以下错误:
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: Logger] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1336)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1262)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at com.gamedacademy.gamedlogger.standalone.StandaloneMain.main(StandaloneMain.java:42)
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [chatlogs]
这是我的persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="Logger" transaction-type="RESOURCE_LOCAL">
<!-- Persistence provider -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- Entity classes -->
<class>com.gamedacademy.gamedlogger.data.ChatLogEntry</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="show_sql" value="true"/>
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
</properties>
</persistence-unit>
</persistence>
这是实体类:
@Entity
@Table(name = "chatlogs")
public class ChatLogEntry {
@Id
@GeneratedValue()
@Column(name = "id",columnDefinition = "INT")
private int id;
@Column(name = "server_id",columnDefinition = "VARCHAR(32)")
private String serverID;
@Column(name = "sender_id",columnDefinition = "BINARY(16)")
private UUID senderID;
@Column(name = "message",columnDefinition = "VARCHAR(256)")
private String message;
@Column(name = "timestamp",columnDefinition = "TIMESTAMP")
private Timestamp timestamp;
/**
* default constructor for JPA
*/
public ChatLogEntry() {
}
public ChatLogEntry(String serverID,UUID senderID,String message,Timestamp time) {
this.serverID = serverID;
this.senderID = senderID;
this.message = message;
this.timestamp = time;
}
public int getId() {
return id;
}
public String getServerID() {
return serverID;
}
public UUID getSenderID() {
return senderID;
}
public String getMessage() {
return message;
}
public Timestamp getTimestamp() {
return timestamp;
}
}
这就是我初始化所有内容的方式:
public static void main(String[] args) {
String dbURL = "jdbc:mysql://localhost:3306/gamedlogger";
String dbUser = "gamedlogger";
String dbPass = "Uu9wWBLe8sunZ4id";
Map<String,Object> props = new HashMap<>();
props.put("javax.persistence.jdbc.url",dbURL);
props.put("javax.persistence.jdbc.user",dbUser);
props.put("javax.persistence.jdbc.password",dbPass);
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Logger",props);
EntityManager loggerEntityManager = entityManagerFactory.createEntityManager();
}
最终,我的目标是让Flyway管理我的数据库迁移并使用JPA / Hibernate进行数据访问。但是我无法让Hibernate正确加载。该数据库存在并使用XAMPP在本地托管(根据PHPMyAdmin,数据库为MariaDB 10.4.11),并且该用户/表也确实具有完全权限。我曾尝试让Hibernate从头开始生成数据库(使用hibernate.hbm2ddl.auto = create),但这样做没有问题,但是当切换Hibernate进行验证时,我仍然遇到完全相同的错误。
如果我禁用验证并尝试运行一些代码,则hibernate确实允许我将数据插入表中,因此我知道它可以访问数据库,我似乎无法追踪为什么hibernate的验证拒绝识别该数据库。表,即使在Google上几个小时后,也可以在stackoverflow上找到。
非常感谢您的帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。