我希望Hibernate在生成DDL时包含来自我的java源代码的注释.我很乐意将其作为注释或javadoc标签.
IOW:我希望能够去
@Entity
@DDLComment "This entity is cool"
class Foo {
@DDLComment "But this field is kinda lame"
int lame_o_rama;
Run Code Online (Sandbox Code Playgroud)
而且(在oracle中),hibernate应该生成
CREATE TABLE FOO ( LAME_O_RAMA number };
COMMENT ON FOO IS 'This entity is cool';
COMMENT ON FOO.LAME_O_RAMA 'But this field is kinda lame';
Run Code Online (Sandbox Code Playgroud)
是否有注释,doc标签,配置选项等,这样做?
我将Play项目从版本2.3.4迁移到2.4.2.这些项目使用JPA(Hibernate)和Evolutions.我有一个最初的Evolutions SQL脚本,它用一些示例数据填充数据库.此脚本现在不再起作用,因为Evolutions脚本现在在Hibernate生成表之前执行,这显然会导致错误.这是一个理想的行为吗?有没有办法改变执行顺序?
hibernate jpa playframework playframework-evolutions playframework-2.4
我的Web框架(Play 1.2.5)创建了一个EJB3Configuration,它用于创建EntityManagerFactory (源)的方法.我正在编写一个脚本,并希望generateSchemaUpdateScript()从Configuration 运行该方法以生成我可以验证并在生产部署上运行的SQL脚本.我遇到的问题是我无法弄清楚如何EntityManagerFactory在构建之后访问所使用的Configuration对象或如何生成Configuration对象.
我的目标是为现有应用程序启用模式和数据迁移.
这种问题似乎已被多次提出,但我认为有不同的要求和情况.
由于我在这个领域缺乏经验,请允许我首先列出应用程序的架构和我的假设.
该应用程序是一个多用户企业桌面应用程序,具有后端服务器,可以持久保存到任何主要数据库(MySql,Postgresql,SQL Server,Oracle DB等).假设数据库是内部部署并由我们的客户维护.
使用的技术堆栈是一个相当常见的Hibernate + Spring + RMI/JMS-Combo.
目前,服务器通过以下方式完成迁移:
CREATE TABLE ...)ALTER TABLE ...)此迁移速度缓慢且仅向前.但这很简单.问题是,到目前为止,模式脚本和数据迁移中的查询一直在使用MySQL语法和功能.
请注意,通过迁移数据,我的意思是:后端服务器将数据从旧模式复制到新模式,必要时进行转换.此外,迁移过程在我们的客户端内部自动启动.意思是,我们只能控制JDBC连接,但不能直接访问数据库,也不了解正在使用的特定数据库(MySQL,SQL Server,...).
目标是用独立于数据库的迁移方案替换或扩充此迁移方案.
StackOverflow 1 2 3 4 5 6 7:回答状态使用Hibernate的内置功能.但是,文档声明这不是生产准备.此外,AFAICT,所有答案仅涉及架构迁移.
Liquibase:使用自定义DSL(在XML/JSON/YAML/etc中),仅允许数据库无关的模式迁移.
DBUnit:使用自定义XML-DSL捕获数据库状态的快照.无法重新创建架构版本1到版本2的快照.
飞路:原则上同Liquibase.但不是数据库独立的,因为SQL-Scripts用于迁移.
JOOQ:基于JDBC的Java中独立于数据库的Query-DSL.可与Criteria API相媲美,但没有JPA的缺点.原则上应该允许数据库独立的数据迁移,但是对于模式迁移没有帮助.
JPA-Query语言如HQL,JPQL,Criteria API是不够的,因为
我意识到,现在这个问题已经存在,它将被视为以意见为基础.
但是,我不一定在寻找这个问题的具体解决方案(我怀疑对于这样一个复杂的问题空间存在明确的解决方案),而是要验证我的假设.
也就是说,这是真的
我想用Hibernate和Postgresql自动创建我的数据库表,但是我得到了关于序列的错误.是否可以使用Hibernate自动创建序列,还是手动生成序列?
我的实体示例:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(uniqueConstraints = { @UniqueConstraint( columnNames = { "id" }) })
@SequenceGenerator(name="SEQ_EXAMPLE_ID", sequenceName="example_id_seq", allocationSize=1)
public class Example {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_EXAMPLE_ID")
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String g
}
Run Code Online (Sandbox Code Playgroud)
Hibernate配置:
hbm2ddl.auto=create-drop
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql=true
Run Code Online (Sandbox Code Playgroud)
例外:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value
org.postgresql.util.PSQLException: …Run Code Online (Sandbox Code Playgroud) 我们可以将多个JPA持久性单元指向同一个数据库,在不同的Java项目中同时部署在服务器上吗?同时我的意思是,不是在同一秒部署,而是部署在一起.我正在使用hsqldb数据库.
我正在为我的项目提供客户端 - 服务器模型.我有一个统一的数据库表,其中服务器填充数据,然后客户端访问不同项目中的数据.我可以通过服务器成功填充数据库.但是当我部署客户端项目时,数据库中的所有数据都会被删除.
我<property name="hibernate.hbm2ddl.auto" value="update" />用于两个持久性单元.
请问,有什么方法可以在 Intellij Idea 中使用 hibernate 从实体类生成数据库表吗?我在网上看到的只是从数据库模式生成实体类。但当我修改任何实体类时,我需要相反的方式来轻松更新我的数据库。
这是我的 hibernate.cfg.xml 文件
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/my_db?useSSL=false</property>
<property name="connection.username">username</property>
<property name="connection.password">password</property>
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="show_sql">true</property>
<property name="current_session_context_class">thread</property>
<property name="hbm2ddl.auto">create</property>
<property name="connection.pool_size">1</property>
<property name="hibernate.dbcp.initialSize">5</property>
<property name="hibernate.dbcp.maxTotal">20</property>
<property name="hibernate.dbcp.maxIdle">10</property>
<property name="hibernate.dbcp.minIdle">5</property>
<property name="hibernate.dbcp.maxWaitMillis">-1</property>
<!--Declaring entity classes to be mapped to the database-->
<mapping class="com.softpager.estores.entities.Order" />
<mapping class="com.softpager.estores.entities.Customer" />
<mapping class="com.softpager.estores.entities.Users" />
<mapping class="com.softpager.estores.entities.Product" />
Run Code Online (Sandbox Code Playgroud)
这是我的 persistence.xml 文件
<persistence-unit name="EStores">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/my_db?useSSL=false"/>
<property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/>
<property name="hibernate.connection.username" value="username"/>
<property name="hibernate.connection.password" value="password"/>
<property name="hibernate.archive.autodetection" value="class"/> …Run Code Online (Sandbox Code Playgroud) 我阅读了有关使用hbm2ddl.auto = update的讨论,以便自动更新对数据库模式的更改.
该线程来自2008年,我不知道今天使用自动更新模式有多安全.
我们正在使用Hibernate 4.3.11和PostgreSQL在Glassfish上运行一个小型JavaEE.我们计划与Jenkins一起使用.
使用hbm2ddl.auto = update是否有用?或者使用一个简单的替代方案来手动更新/检查更新是否更好?
我知道很难发表一揽子声明.
我从事远程项目,并在日志中找到了有趣的记录:
2015-12-26 00:28:30,835 DEBUG org.hibernate.tool.hbm2ddl.SchemaUpdate
Caller+0 at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:251)
=> alter table bail add column monthName tinyblob
Run Code Online (Sandbox Code Playgroud)
日志设置为:
<logger level="trace" name="org.hibernate.tool.hbm2ddl"/>
Run Code Online (Sandbox Code Playgroud)
尝试确定会发生什么情况时:
<prop key="hibernate.hbm2ddl.auto">update</prop>
Run Code Online (Sandbox Code Playgroud)
第一次从备份运行。
当我看到Bail.java源代码时,我感到很惊讶:
String[] monthName = {"??????", "???????",
"?????", "??????", "???", "????", "????",
"???????", "????????", "???????", "??????",
"???????"
};
Run Code Online (Sandbox Code Playgroud)
所以这是常数场!
用JPA / Hibernate将常量声明存储在实体类中是否正确?
我应该如何标记常量,使其不成为实体属性?
我认为该static关键字可以胜任工作,并且可以将代码重构为:
public static final String[] monthName =
Collections.unmodifiableList(Arrays.asList(
"??????", "???????", "?????", "??????", "???", "????", "????",
"???????", "????????", "???????", "??????", "???????"
));
Run Code Online (Sandbox Code Playgroud)
因为hbm2ddl.auto=update我部署了生产版本,所以我应该警告DBA删除不必要的monthName列。
我尝试向实体 Customer 添加一个新属性,该实体已将数据存储在数据库中:
private boolean isArchived;
Run Code Online (Sandbox Code Playgroud)
当我启动 spring 并尝试更新表时,这给了我以下错误:
Error executing DDL "alter table customer add column is_archived boolean not null" via JDBC Statement
Run Code Online (Sandbox Code Playgroud)
这是因为他尝试用 null 初始化isArchived已经存在的行,并且原始类型不能为 null 吗?有没有一种方法可以用 false 来初始化它们,或者我必须使用Boolean而不是boolean允许空值(我不想允许)?