问题描述
我的项目仅从JPA开始,并且没有Spring。后来,我添加了Liquibase,并且持久性单元名称存在一些问题,因为必须具有一个持久性单元名称才能使用EntityManager
。
entityManagerFactory = Persistence.createEntityManagerFactory("MyPU");
因此,为了能够继续使用Liquibase创建表并使用JPA持久存储到数据库中,尽管保留了相同的数据库配置,我仍然保留了persistence.xml
和liquibase.properties
文件。
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">
<persistence-unit name="MyPU">
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/jpa_specialist?createDatabaseIfNotExist=true&useTimezone=true&serverTimezone=UTC"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
changeLogFile=src/main/resources/META-INF/database/dbchangelog.xml
url=jdbc:mysql://localhost/jpa_specialist?createDatabaseIfNotExist=true&useTimezone=true&serverTimezone=UTC
username=root
password=root
我看过liquibase-hibernate
,但我不太了解它,但是它似乎用于生成diff文件,目前我不需要。
两个文件都需要吗?我可以做一些只有其中之一的事情吗?
解决方法
Liquibase没有直接方法从presistence.xml文件中读取url /用户名/密码信息。 liquibase-hibernate扩展确实添加了将数据库与Java文件映射文件进行差异化的支持,但并未更改Liquibase如何获取url / username / password。
您说过您没有使用Spring,但是如果您仍在Web应用程序中,则可以使用Liquibase servlet listener运行Liquibase,它会从预先配置的数据源中拉出连接。 JPA可以从相同的预配置数据源中提取数据,而不必重新定义配置。
否则,除非您需要执行一些自定义Java编码来解析persistence.xml文件并将其传递到Liquibase,否则您确实需要两个文件。
为避免重复,您可以执行一些操作,例如在maven / gradle /任何设置中定义构建属性,并将<property name="javax.persistence.jdbc.url" value="${database.url}"/>
保存在persistence.xml源文件中,将url: ${database.url}
保存在liquibase.properties文件中