使用 Hibernate(不是在春天!!!!!!),我和你们中的许多人一样,懒得手动设置数据库。在项目中使用自动文件搜索和自动配置很好。一切都会好的,但是在 Github 上需要一个新项目,但我不想显示登录名、密码和 URL。
需要一个示例代码,其中 Hibernate 将获取主文件和机密文件并在程序启动时自动配置。
目前我正在使用hibernate.cfg.xml,但application.properties也接受了答案。
我的(工作)代码示例:
HibernateUtil.java:
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateUtil {
private static StandardServiceRegistry registry;
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
// Create registry
registry = new StandardServiceRegistryBuilder().configure().build();
// Create MetadataSources
MetadataSources sources = new MetadataSources(registry);
// Create Metadata
Metadata metadata = sources.getMetadataBuilder().build();
// Create SessionFactory
sessionFactory = metadata.getSessionFactoryBuilder().build();
} catch (Exception e) {
e.printStackTrace();
if (registry != null) {
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
return sessionFactory;
}
public static void shutdown() {
if (registry != null) {
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
休眠.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- JDBC Database connection settings -->
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!--SERVER-->
<!--<property name="connection.url">jdbc:mysql://localhost:3306/db?useSSL=false&autoReconnect=true&createDatabaseIfNotExist=true&</property>-->
<property name="connection.username">USERNAME</property>
<property name="connection.password">PASSWORD</property>
<property name="connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider</property>
<property name="hibernate.hikari.connectionTimeout">20000</property>
<property name="hibernate.hikari.minimumIdle">10</property>
<property name="hibernate.hikari.maximumPoolSize">20</property>
<property name="hibernate.hikari.idleTimeout">300000</property>
<!-- JDBC connection pool settings ... using built-in test pool -->
<property name="connection.pool_size">1</property>
<!-- Select our SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<!-- Echo the SQL to stdout -->
<property name="show_sql">false</property>
<!--<property name="show_sql">true</property>-->
<!-- Set the current session context -->
<property name="current_session_context_class">thread</property>
<!-- Drop and re-create the database schema on startup -->
<!--<property name="hbm2ddl.auto">create</property>-->
<!--<property name="hbm2ddl.auto">create-drop</property>-->
<!--<property name="hbm2ddl.auto">update</property>-->
<property name="hbm2ddl.auto">validate</property>
<!-- dbcp connection pool configuration -->
<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>
<!--<mapping class="entities.User" />-->
<!--<mapping class="entities.Servers" />-->
<!--<mapping class="entities.Authorities" />-->
<!--<mapping class="entities.Language" />-->
<!--<mapping class="entities.ServerMessage" />-->
<!--<mapping class="entities.MessageServer" />-->
</session-factory>
</hibernate-configuration>
如果您不使用 Spring 工具包或将设置移动到单独的属性文件中的任何其他可能性,那么您可以执行以下操作:
制作 hibernate.cfg.xml 的副本,随意命名,例如 hibernate.mock.cfg.xml。在此文件中,将密码和名称更改为 stubs。将原始 hibernate.cfg.xml 文件添加到 gitignore。
然后 SessionFactory 声明块将如下所示:
上面的代码是这样工作的:当您尝试获取不在 git 中的 hibernate.cfg.xml 时,将从存根中读取配置。因此,为了解决这个问题,我们使用了 hibernate 中的标准配置选项。您可以在此处阅读有关此内容的更多信息:https ://docs.jboss.org/hibernate/orm/3.5/reference/en/html/session-configuration.html
或者,根据类似的原则:
在这种情况下,您将需要编写一个 LoginHandler 类,该类将从正确的位置(例如,从不同的属性)获取必要的登录名和密码。
将属性文件添加到项目中。例如,
dbParams.properties在哪里写下地址、端口、登录名和密码。启动时,从此文件中获取数据并通过StandardServiceRegistryBuilder. 并且properties文件本身就是.gitignore中的菜园所以没有上传到github。以任何安全的方式将其传递给合适的人。这个答案将被修改。
特别感谢zdadco帮助我找到这个问题的答案。
春天+休眠(+ Maven)
如果您使用的是 Spring + Hibernate,请执行以下操作:
Resources(文件所在的位置application.properties)中创建一个文件database.properties@PropertySource("classpath:database.properties"),最终结果如下: