我真的想知道更多有关更新,导出和可以提供给hibernate.hbm2ddl.auto
我需要知道何时使用更新的值的更多信息,何时不知道?还有什么选择?
这些是可能发生在DB上的变化:
在每种情况下,最佳解决方案是什么?
我正在使用spring boot spring.jpa.hibernate.ddl-auto=create,但是当应用程序重新启动时,所有表都会丢弃并再次创建.有没有办法避免现有表的重新创建?
我的系统运行在Linux Mandriva,RDBMS - MySQL 5上.我需要使用UTF-8创建数据库和表.
这是hibernate.cfg.xml的一个片段-
...
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.characterEncoding">utf8</property>
...
Run Code Online (Sandbox Code Playgroud)
my.cnf -
# The MySQL server
[mysqld]
...
default-character-set=cp1251
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect="SET NAMES cp1251"
skip-character-set-client-handshake
...
[mysqldump]
...
default-character-set=cp1251
...
Run Code Online (Sandbox Code Playgroud)
有些课,例如 -
@Entity
@Table(name = "USER")
public class User {
@Id
@Column(name = "USERID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "USERNAME")
private String name;
@Column(name = "USERPASSWORD")
private String password;
@Column(name = "USERIP")
private String ip;
// …Run Code Online (Sandbox Code Playgroud) 我的项目中有注释驱动的hibernate功能.
现在我想在列上创建索引.我目前的列定义是
@NotNull
@Column(name = "hash")
private String hash;
Run Code Online (Sandbox Code Playgroud)
我在@Index这里添加注释.
@NotNull
@Column(name = "hash")
@Index(name="hashIndex")
private String hash;
Run Code Online (Sandbox Code Playgroud)
然后DROP TABLE并重启Tomcat服务器.在实例化服务器之后,会创建表,但我无法在后续查询中看到新索引.
SHOW INDEX FROM tableName
Run Code Online (Sandbox Code Playgroud)
期望用新索引构造表.我正在使用带有MySQL的InnoDB.
java annotations hibernate hibernate-annotations database-indexes
我的数据库背景来自Django框架(python).在Django中,开始使用数据库迁移很容易:Django迁移.Django框架提供了基于模型创建迁移的工具,以及在数据库上应用迁移的工具.我认为这种做法在开发和生产中都有效.您不必自己编写迁移,框架为您创建了它们.
现在我已经启动了一个Spring Boot和Hibernate项目.我将我的应用程序配置为使用带有JPA的hibernate.有了这些设置,我现在需要知道我的框架如何处理数据库迁移?我的意思是,如果我更改列,无论是类型,还是可能删除它,那么如何将数据库迁移到更改?我知道spring boot会在启动时自动检测列更改,并根据模型(Entity)创建不存在的列.我想这与变量有关
spring.jpa.hibernate.ddl-AUTO
但它如何处理现有的数据库对象?它是否也将列添加到它们中,具有什么价值?我设置的默认值?如果我更改列类型怎么办?它可以处理变化吗?从长远来看,这些设置和spring-boot自动数据库管理可能还不够?
我想知道的是,有关如何使用Spring Boot和hibernate组合处理数据库迁移的最佳实践是什么?我相信这个组合的大多数人如何处理迁移有一个标准?我希望它和Django一样简单...我知道flyway,但不知道我是否真的需要它,或者它是否与我的这种组合(包括弹簧启动和休眠)使用得多.
我正处于JEE开发的近期阶段.有很多建议不要在生产中使用Hibernate的hbm2ddl.auto,我决定删除它.
所以现在,我发现了Flyway,这对于未来的数据库更改和迁移似乎很有用,但我在第一步陷入困境:我有很多实体,一些实体继承自基础实体.这使得CREATE语句非常复杂.
创建第一个迁移文件的最佳做法是什么?
谢谢!
我正在开发spring boot多租赁应用程序.我已经配置了多个数据源,如下所示:
application.properties
spring.multitenancy.datasource1.url=jdbc:mysql://localhost:3306/db1
spring.multitenancy.datasource1.username=root
spring.multitenancy.datasource1.password=****
spring.multitenancy.datasource1.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.multitenancy.datasource2.url=jdbc:mysql://localhost:3306/db2
spring.multitenancy.datasource2.username=root
spring.multitenancy.datasource2.password=****
spring.multitenancy.datasource2.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.multitenancy.datasource3.url=jdbc:mysql://localhost:3306/db3
spring.multitenancy.datasource3.username=root
spring.multitenancy.datasource3.password=****
spring.multitenancy.datasource3.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
Run Code Online (Sandbox Code Playgroud)
DataSourceBasedMultiTenantConnectionProviderImpl.java
@Component
public class DataSourceBasedMultiTenantConnectionProviderImpl extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {
private static final long serialVersionUID = 8168907057647334460L;
private static final String DEFAULT_TENANT_ID = "tenant_1";
@Autowired
private DataSource dataSource1;
@Autowired
private DataSource dataSource2;
@Autowired
private DataSource dataSource3;
private Map<String, DataSource> map;
@PostConstruct
public void load() {
map = new HashMap<>();
map.put("tenant_1", dataSource1);
map.put("tenant_2", dataSource2);
map.put("tenant_3", dataSource3);
}
@Override
protected DataSource selectAnyDataSource() {
return map.get(DEFAULT_TENANT_ID);
} …Run Code Online (Sandbox Code Playgroud) 我正在发展springboot-springsession-jdbc-demo.当我只是运行代码时,我得到以下错误.它看起来我需要设置一些属性application.properties,以便事先创建模式/表.必需的配置已经放置,但仍然会出错.该代码存在于https://github.com/sivaprasadreddy/spring-session-samples中
参考错误:
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [DELETE FROM SPRING_SESSION WHERE LAST_ACCESS_TIME < ?]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.spring_session' doesn't exist
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231) ~[spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) ~[spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:870) ~[spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:931) ~[spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:941) ~[spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.session.jdbc.JdbcOperationsSessionRepository$6.doInTransaction(JdbcOperationsSessionRepository.java:481) ~[spring-session-1.2.1.RELEASE.jar:na]
at org.springframework.session.jdbc.JdbcOperationsSessionRepository$6.doInTransaction(JdbcOperationsSessionRepository.java:478) ~[spring-session-1.2.1.RELEASE.jar:na]
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) ~[spring-tx-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.session.jdbc.JdbcOperationsSessionRepository.cleanUpExpiredSessions(JdbcOperationsSessionRepository.java:478) ~[spring-session-1.2.1.RELEASE.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at …Run Code Online (Sandbox Code Playgroud) 我在JPA遇到了一些麻烦.如果有人能提供解决方案,我会非常感激.用JPA(我使用的是MySQL DB),比方说,我有一个映射如下的类:
@Entity
class Employee{
int id;
String employeeName;
//getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
映射到表时,我看到String varchar(255)在Mysql中映射.但是,假设我有一个名称超过255个字符的员工,它会显示数据截断错误.
我知道我们可以通过在Employee列中添加"length"属性来解决这个问题:
@column(length=1000)
String employeeName;
Run Code Online (Sandbox Code Playgroud)
这是唯一可行的方法吗?我想,如果我们只是在java中映射到String,数据库将动态分配长度.
我有一个名为Person的表,我已经在hibernate中映射了我已经有一些我不想放松的数据了.我需要添加一个名为address的新列,任何想法如何在hibernate中做到这一点?
提前致谢..
hibernate ×8
java ×8
spring ×4
spring-boot ×4
jpa ×3
mysql ×2
annotations ×1
database ×1
flyway ×1
hbm2ddl ×1
java-ee ×1
linux ×1
orm ×1
spring-jdbc ×1