我想我正在尝试做一些非常简单的事情.在JPA中使用Spring Boot(1.3.3.RELEASE)我想设置一个表名.
@Entity
@Table(name = "MyTable_name")
public class MyTableData {
...
}
Run Code Online (Sandbox Code Playgroud)
我期望在我的数据库中有一个带有"MyTable_name"的表.对我来说似乎完全合理.但这不会发生.我得到一个名为"MY_TABLE_NAME"(H2后端)或"my_table_name"(Postgre后端)的表.从这里开始,我会坚持使用Postgre,因为我的目标是读取一个我不控制表名的现有数据库.
经过一些研究后,我发现帖子说我应该使用spring.jpa.hibernate.naming-strategy属性.这没有多大帮助.设置为最常推荐的org.hibernate.cfg.ImprovedNamingStrategy会产生相同的行为:"my_table_name".设置为org.hibernate.cfg.EJB3NamingStrategy会生成"mytable_name".设置为org.hibernate.cfg.DefaultNamingStrategy会导致Spring内部的应用程序上下文错误.
辞职写我自己,我开始看org.hibernate.cfg.ImprovedNamingStrategy.我发现它使用了弃用的org.hibernate.cfg.NamingStrategy.这表明使用NamingStrategyDelegator.我查看了它的Java文档,但不确定如何应用.我找到了这篇文章.尽管我很欣赏这个解释,但是我想要做的事情比我需要的更复杂,而且我在应用它时遇到了麻烦.
那么我的问题是如何让Spring JPA只使用我指定的名称?是否有使用NamingStrategyDelegator的新属性?我需要编写自己的策略吗?
===========更新==========================
我想我正在回答一个问题.我创建了一个简单的Spring启动应用程序(与我的生产项目分开).我使用H2作为后端DB.
关于Hiberate 5命名的讨论非常有用.有了它,我想出了如何在Hibernate 5中设置命名策略,如下所示(在application.properties中).
hibernate.implicit_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Run Code Online (Sandbox Code Playgroud)
我创建了一个通过名称传递的物理命名策略(如org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl)并打印出值.从那里我看到表名是我想通过物理命名层.
然后我设置hibernate.show_sql = true来显示生成SQL.在生成的SQL中,名称也是正确的.
我正在使用DatabaseMetaData检查表名.
private void showTables() throws SQLException {
DatabaseMetaData dbMetadata = getConnection().getMetaData();
ResultSet result = dbMetadata.getTables(null, null, null, new String[] { "TABLE" });
if (result != null) {
boolean haveTable = false;
while (result.next()) {
haveTable = true;
getLogger().info("Found table {}", result.getString("TABLE_NAME"));
}
if (!haveTable) { …
Run Code Online (Sandbox Code Playgroud) 我正在将 Hibernate Envers 与实体一起使用
@Entity
@Table(name = "users", schema = "core")
@Audited public class Users implements java.io.Serializable, Comparable<Users> {
protected static final long serialVersionUID = 1250157348010696249L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "userid")
protected Integer userId;
@Column(name = "aduserid")
protected String aduserId;
@Column(name = "firstname")
protected String firstName;
@Column(name = "middlename")
Run Code Online (Sandbox Code Playgroud)
我收到错误休眠序列不存在。
当我更改 false 时,它说修订生成器不存在。请帮助我。
我是Hibernate的新手.当我保存特定的实体然后它重写现有的数据.
我使用ID作为自动生成如下:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private int id;
Run Code Online (Sandbox Code Playgroud)
在这里我保存实体如下:
class StudDAO() {
public static void main(String[] args){
StudDAO obj = new StudDAO();
Stud stud = new Stud();
stud.setName("Test");
stud.setCity("Mumbai");
obj.createStud(stud);
}
public void createStud(Stud stud) {
try {
Session session = HibernateSessionFactory.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.save(stud);
transaction.commit();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
transaction.rollback();
}
}
Run Code Online (Sandbox Code Playgroud)
}
如果我将在下次更改实体值,那么它应该生成下一个id而不是从第一个id开始.
任何时候结果都一样
mysql> select * from stud;
+----+--------+------+
| id | city | name |
+----+--------+------+
| 1 …
Run Code Online (Sandbox Code Playgroud) 我正在使用hbmddl.auto
set在hibernate配置文件中创建并使用它以网络模式连接到derby数据库(未嵌入,不知道是否相关).
这是我的 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>
<!-- Database connection settings -->
<property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="connection.url">jdbc:derby://localhost:1527/HibernateDb;create=true</property>
<property name="connection.username">admin</property>
<property name="connection.password">admin</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.DerbyDialect</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create-drop</property>
<!-- Names the annotated entity class …
Run Code Online (Sandbox Code Playgroud) 我的Web框架(Play 1.2.5)创建了一个EJB3Configuration,它用于创建EntityManagerFactory
(源)的方法.我正在编写一个脚本,并希望generateSchemaUpdateScript()
从Configuration 运行该方法以生成我可以验证并在生产部署上运行的SQL脚本.我遇到的问题是我无法弄清楚如何EntityManagerFactory
在构建之后访问所使用的Configuration对象或如何生成Configuration对象.
如何仅使用Java和注释在Spring中设置以下内容.
<property name="hibernate.hbm2ddl.auto" value="update"/>
我应该是可能的,我相信让xml项目免费更清洁.
PS:这应该不重要,但我在Heroku上运行它.
java spring hibernate spring-annotations hibernate-annotations
在休眠中是否类似于实体框架中的代码优先方法?我正在尝试从 java 类(MySQL)准备数据库表。我已经准备好了带有 JPA 注释的 java 类,但我不知道现在该怎么做(我正在使用 IntelliJ)。我的 main 中应该有什么来创建这些表?或者我应该使用一些工具?
我的一门课是这样的:
@Entity
public class Item {
@Id
@GeneratedValue
private long id;
@Column
private String text;
@ManyToMany(mappedBy = "items")
private Set<Container> containers = new HashSet<Container>();
public long getId() {
return id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Set<Container> getContainers() { return containers; }
}
Run Code Online (Sandbox Code Playgroud) 查看与 Hibernate 模式生成器相关的问题(例如,这个问题)使我得出这样的结论:设置行为的属性是hibernate.hbm2ddl.auto
。
然而,它似乎被忽略,因为它的值是什么并不重要——当 Spring Boot 应用程序部署到 Wildfly 时,模式总是被导出,并且表总是被删除。
以下代码包含 H2 数据源和 Hibernate 会话工厂的导入和配置 bean。
import javax.sql.DataSource;
import java.util.Properties;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Bean
public DataSource dataSource() {
return new DriverManagerDataSource(h2Connection, h2Username, h2Password);
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
properties.put("hibernate.show_sql", true);
properties.put("hibernate.hbm2ddl.auto", "validate");
LocalSessionFactoryBean localSessionFactory = new LocalSessionFactoryBean();
localSessionFactory.setDataSource(dataSource());
localSessionFactory.setHibernateProperties(properties);
localSessionFactory.setAnnotatedClasses(new Class[] { Account.class, Product.class, Subscription.class });
return localSessionFactory;
}
Run Code Online (Sandbox Code Playgroud)
过去几天我一直在研究这个问题,但仍然没有找到正确的解决方案。否则休眠工作正常。
问题是如何在每次部署时禁用表删除,以便 H2 数据库中的数据不会丢失。
更新 看起来当会话关闭时表被删除(新部署开始)
2015-11-05 04:39:15 INFO …
Run Code Online (Sandbox Code Playgroud) 我对数据库开发还很陌生,所以也许这个问题并不完全正确,但如果有人能让我更清楚一点,我将不胜感激......我已经阅读了有关序列的所有内容,以及它们的首选方式超越身份。我有一个假设性问题。如果我要使用序列与 Hibernate(数据插入)和 Liquibase(模式创建)一起生成 PK,那么定义序列的正确位置是什么?
例如:类级别的序列生成。
用户.java
@Entity
@Table(name = "USER")
public class User {
@Id
@SequenceGenerator(name = "USER_SEQ", sequenceName = "USER_SEQ")
@GeneratedValue(strategy = SEQUENCE, generator = "USER_SEQ")
@Column(name = "ID")
private Long id;
// other fields
}
Run Code Online (Sandbox Code Playgroud)
或其他示例:模式级别的序列生成。
变更日志.xml
<changeSet author="wesleyy">
<createSequence catalogName="cat"
cycle="true"
incrementBy="1"
maxValue="1000"
minValue="10"
ordered="true"
schemaName="public"
sequenceName="user_seq"
startValue="1"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
是否需要在 Liquibase 和 Hibernate 中定义序列?两者到底有什么区别?
我正在使用 spring boot 和 jpa,并且我有一个属性为 VARCHAR 255 的现有表:
@Column(name = "description")
private String description;
Run Code Online (Sandbox Code Playgroud)
我尝试将其更改为长文本,但没有成功:
@Column(name = "description", columnDefinition = "longtext")
private String description;
Run Code Online (Sandbox Code Playgroud)
我在 application.properties 文件中有关 Hibernate ddl 的配置设置为更新:
spring.jpa.hibernate.ddl-auto = update
Run Code Online (Sandbox Code Playgroud)
是否可以将 VARCAR 255 更改为长文本?如果是的话,我该怎么做?
谢谢,阿维