当前位置: 首页 > 面试题库 >

休眠自定义架构创建

端木望
2023-03-14
问题内容

<prop key="hibernate.hbm2ddl.auto">create</prop>创建一个新的数据库架构,并创建一个<prop key="hibernate.hbm2ddl.auto">update</prop>不存在的数据库架构,并更新现有的数据库架构。如果我想检查数据库模式是否存在,并根据将要创建的数据库模式来检查,该如何实现。目前,我的配置applicationContext.xml是:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="annotatedClasses">
        <list>
            <value>info.ems.models.User</value>
            <value>info.ems.models.Role</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>        
</bean>
<bean id="dao" class="info.ems.hibernate.HibernateEMSDao" init-method="createSchema">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

和HibernateEMSDao.java:

public class HibernateEMSDao implements EMSDao {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    private HibernateTemplate hibernateTemplate;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.hibernateTemplate = new HibernateTemplate(sessionFactory);
    }

    public void saveUser(User user) {
        hibernateTemplate.saveOrUpdate(user);
    }

    public List<User> listUser() {
        return hibernateTemplate.find("from User");
    }

    public void createSchema() {
        logger.info("inserting default admin user into database");
        User admin = new User();
        admin.setUsername("admin");
        admin.setName("Admin");
        admin.setEmail("admin");
        admin.setPassword("21232f297a57a5a743894a0e4a801fc3");
        saveUser(admin);
        logger.info("Admin inserted into database");

        try {
            System.out.println(listUser().get(0).getId());
        } catch (Exception e) {
            logger.error("===================Error================");
        }
    }               
}

这是工作。什么配置可以帮助我实现这一目标?就像是:

  • 检查ID = 1的用户是否存在
  • 如果没有创建架构

感谢致敬。


问题答案:

您可以禁用该hibernate.hbm2ddl.auto选项,检查条件(可能使用普通的JDBC),然后调用(或不调用)SchemaExport类的create方法。这将在您的应用程序的初始化代码中完成(如果您使用的是Web应用程序)。ServletContextListener

有关如何使用SchemaExport该类的示例:

AnnotationConfiguration config = new AnnotationConfiguration();
config.addAnnotatedClass(info.ems.models.User.class);
config.addAnnotatedClass(info.ems.models.Role.class);
config.configure();
new SchemaExport(config).create(true, true);


 类似资料:
  • 问题内容: 我正在使用hibernate 4和spring 4为Java Web应用程序设置多租户支持。默认模式是在应用程序启动时创建和设置的。当不尝试支持多租户时,此架构可以正常工作。 现在,我需要为每个创建帐户的新租户创建一个架构。该模式可以简单地是通用模式的副本,因为它将遵循相同的格式。 如何在运行时创建与默认架构相同格式的新架构?似乎在实例化LocalSessionFactoryBean时

  • 问题内容: 我写这篇文章,以了解是否有人知道该怎么做: 我想做这个插入: 加密是存储在我的数据库中的函数,也是我想在代码中插入的函数。实际上,当我想在数据库中插入某些内容时,我会使用: 但是我想进行“自定义”插入,因为我需要使用该功能。 我正在使用hibernate+注释: 但是必须从文件中读取密钥“ cdp”,因此该解决方案对我不起作用。 我想在代码上使用一种方法来执行SQL查询(INSERT查

  • 问题内容: 是否可以在JPA / Hibernate中覆盖表名称,以便为所有项目实体添加通用前缀?例如,能够通过“ JBPM5_”前缀为所有JBPM 5表添加前缀。 可接受答案的示例: 问题答案: 一次重命名所有表的一种方法是实现自己的namingStrategy(的实现)。 使用的NamingStrategy在persistence.xml中由

  • 问题内容: 我正在使用hibernate注释,并且想导出数据库模式。 类似于带有hbm xml文件的schemaexporttask。 问题答案: 确实,原始的Hibernate Core 只能处理Hibernate XML映射文件,而不能处理注释。您需要的是Hibernate Tools 附带的工具。 这是一个改编自Java Persistence With Hibernate的用法示例: 也可

  • 问题内容: 我已经创建了一个UserType(请参见下文)来处理mySQL数据库中的一种情况,在该情况下我们将空日期保存为0000-00-00 00:00:00。 当我尝试使用dispDT的null持久化我的实体时(请参见下文),它将生成以下异常:“ javax.persistence.PersistenceException:org.hibernate.PropertyValueExceptio

  • 问题内容: 我有一个客户端服务器应用程序,并且在我的服务器中,我正在使用hibernate模式进行数据库处理。现在,我的应用程序需要所有数据库表中的一个简单表,其中仅一个行包含一个字段(这是该行的键)。该表实际上仅包含一个全局编号(从1开始),我在用户每次执行某些操作时都会使用该编号,当他执行此操作时,我需要获取该值并在数据库中递增该值。(表应该只包含一行,并且始终只有一个值) 我正在使用以下代码