相关疑难解决方法(0)

在Spring JPA中设置表名

我想我正在尝试做一些非常简单的事情.在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)

spring naming hibernate jpa

10
推荐指数
1
解决办法
1万
查看次数

Hibernate_sequence 在 hibernate envers 中不存在

我正在将 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 时,它​​说修订生成器不存在。请帮助我。

java hibernate

7
推荐指数
2
解决办法
5351
查看次数

当持久化/保存实体时,HIbernate会覆盖数据

我是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)

hibernate

6
推荐指数
1
解决办法
1万
查看次数

架构不会在hbmddl.auto = create.drop上删除

我正在使用hbmddl.autoset在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)

hibernate derby hbm2ddl

6
推荐指数
1
解决办法
2万
查看次数

在构建EntityManagerFactory后如何获得Hibernate配置?

我的Web框架(Play 1.2.5)创建了一个EJB3Configuration,它用于创建EntityManagerFactory (源)的方法.我正在编写一个脚本,并希望generateSchemaUpdateScript()从Configuration 运行该方法以生成我可以验证并在生产部署上运行的SQL脚本.我遇到的问题是我无法弄清楚如何EntityManagerFactory在构建之后访问所使用的Configuration对象或如何生成Configuration对象.

java hibernate playframework playframework-1.x

6
推荐指数
1
解决办法
4067
查看次数

如何使用Annotations和纯Java在Spring中设置hibernate.hbm2ddl.auto

如何仅使用Java和注释在Spring中设置以下内容.

<property name="hibernate.hbm2ddl.auto" value="update"/>

我应该是可能的,我相信让xml项目免费更清洁.

PS:这应该不重要,但我在Heroku上运行它.

java spring hibernate spring-annotations hibernate-annotations

6
推荐指数
1
解决办法
8251
查看次数

从实体创建数据库表

在休眠中是否类似于实体框架中的代码优先方法?我正在尝试从 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)

java mysql orm hibernate jpa

5
推荐指数
1
解决办法
2万
查看次数

Hibernate 架构在部署时自动删除

查看与 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)

java spring hibernate

5
推荐指数
1
解决办法
7695
查看次数

SQL 序列:Hibernate 和 Liquibase

我对数据库开发还很陌生,所以也许这个问题并不完全正确,但如果有人能让我更清楚一点,我将不胜感激......我已经阅读了有关序列的所有内容,以及它们的首选方式超越身份。我有一个假设性问题。如果我要使用序列与 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 中定义序列?两者到底有什么区别?

java sql hibernate liquibase

5
推荐指数
1
解决办法
2万
查看次数

更改 spring jpa 现有表列类型

我正在使用 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 更改为长文本?如果是的话,我该怎么做?

谢谢,阿维

mysql hibernate jpa spring-boot

5
推荐指数
1
解决办法
7588
查看次数