我目前正在将我的数据库层(实体和dao)从javaee迁移到quarkus(或者从wls迁移到openshift),我还不太清楚一些细节:
目前我有目前的结构:
信息类registeredtime.java
定义列名等的实体类,registeredtimeentity.java,具有匹配的persistence.xml
要在registeredtime.java和registeredtimeentity.java之间Map的mapstructMap器类
使数据库访问更容易的dao类,registeredtimedao.java
structure.ddl来定义数据库结构
内存类testdb.java,它扩展了jdbcdaosupport(springframework)并使用derby
我的测试类registeredtimedaotest使用testdb进行内存中的测试:
class RegisteredTimeDAOTest extends Specification {
private RegisteredTimeId registeredTimeId;
private RegisteredTimeData registeredTimeData;
private long userId;
private int userVersion;
private RegisteredTime registeredTime;
private Long userNumber;
private LocalDate startDate, endDate
private Boolean registration
private Boolean registrationApproved
private String registration
private String timeType
private LocalDate incomingDate
@Shared
private EntityManager entityManager
@Shared
private EntityManagerFactory entityManagerFactory
@Shared
private TestDB db
static SingleConnectionDataSource dataSource
private RedovisadTidEntity registeredTimeEntity
private RegisteredTimeDAO instance
private Gson gson
def setupSpec() {
db = new TestDB("test")
db.start()
dataSource = new SingleConnectionDataSource(db.getJDBCUrl(), true)
entityManagerFactory = Persistence.createEntityManagerFactory("EKN-Persistence-Test")
entityManager = entityManagerFactory.createEntityManager()
}
def cleanupSpec() {
if (entityManager != null) {
entityManager.close()
}
if (entityManagerFactory != null) {
entityManagerFactory.close()
}
db.shutdown()
}
def setup() {
userId = 1
userVersion = 1
userNumber = 1991010101011L
startDate = LocalDate.of(2020, 01, 01)
endDate = LocalDate.of(2020, 01, 31)
registration = false
registrationApproved = false
registration = null
timeType = TimeType.STANDARD_TIME;
incomingDate = LocalDate.of(2020, 02, 03)
registeredTimeId = new RegisteredTimeId(userId, userVersion)
registeredTimeData = RegisteredTimeData.newRegisteredTimeDataBuilder()
.userNumber(userNumber)
.startDate(startDate)
.endDate(endDate)
.registration(registration)
.registrationApproved(registrationApproved)
.timeType(timeType)
.incomingDate(incomingDate)
.build()
registeredTime = new RegisteredTime().newRedovisadTidBuilder()
.registeredTimeId(registeredTimeId)
.registeredTimeData(registeredTimeData)
.build()
registeredTimeEntity = RegisteredTimeMapper.INSTANCE.toRegisteredTimeEntity(registeredTime)
instance = new RegisteredTimeDAO(entityManager)
}
def cleanup() {
instance = null
}
def "Save RegisteredTime"() {
given:
Statement statement = dataSource.getConnection().createStatement()
statement.executeQuery("SELECT * FROM registeredtime")
ResultSet rs = statement.getResultSet()
gson = new Gson()
when:
entityManager.getTransaction().begin()
instance.save(registeredTime)
entityManager.getTransaction().commit()
then:
while (rs.next()) {
assert rs.getInt(2) == userVersion
assert rs.getLong(3) == userNumber
assert gson.fromJson(rs.getString(4), RegisteredTimeData.class).equals(registeredTimeData)
assert rs.getTime(5) != null
}
}
def "Get RegisteredTime"() {
when:
entityManager.getTransaction().begin()
RegisteredTime registeredTimeGet = instance.get(1000, userVersion)
entityManager.getTransaction().commit()
then:
assert registeredTimeGet.getRegisteredTimeId().getAnsokanId() == userId
assert registeredTimeGet.getRegisteredTimeId().getAnsokanVersion() == userVersion
assert registeredTimeGet.getRegisteredTimeData().getKundId() == userNumber
assert registeredTimeGet.getRegisteredTimeData().getFromdatum() == startDate
assert registeredTimeGet.getRegisteredTimeData().getTomdatum() == endDate
assert registeredTimeGet.getRegisteredTimeData().getAnmalanAF() == registration
assert registeredTimeGet.getRegisteredTimeData().getFranvarogodkandAF() == registrationApproved
assert registeredTimeGet.getRegisteredTimeData().getTimeType() == timeType
assert registeredTimeGet.getRegisteredTimeData().getAngavsviddatum() == incomingDate
}
}
我一直潜伏在quarkus.io上并阅读以下内容:
https://quarkus.io/guides/datasource
https://quarkus.io/guides/hibernate-orm (可能是最重要的一个)
https://quarkus.io/guides/getting-started (ofc公司)
https://quarkus.io/guides/gradle-tooling (使用渐变)
实体类仍然是必需的,但是entitymanagerfactory已经被关闭,datasource和entitymanger可以被注入,对吗?
我需要重写testdb还是有一个“开箱即用”的解决方案?我查看了zero-config设置(devservices),但这不允许我配置db。我不想再扩展springframework了。
如果我使用hibernate而没有华丽的外观,我需要一把刀吗?
1条答案
按热度按时间ru9i0ody1#
我猜你在用斯波克做测试。
quarkus只支持junit5,因此您应该尝试使用基于junit5的spock 2.0-m5,如果可能的话,可以通过其应用程序使用quarkus junit5支持
quarkus-junit5
分机。quarkus和spock支持有一个问题,您可以观看。
请注意,quarkus不支持groovy或spock。
作为替代,你也可以尝试这个quarkus spock扩展,不知道它的状态是什么,我只是通过谷歌搜索找到的。
关于您的问题:
实体类仍然是必需的,但是entitymanagerfactory已经被关闭,datasource和entitymanger可以被注入,对吗?
如果您使用的是quarkus hibernate orm扩展,它是一个常规的hibernate集成,因此是一个jpa实现,因此您需要定义jpa实体类。然后你可以注射
EntityManager
. 你也可以注射Datasource
但最好用EntityManager
因为它提供了更高级别的集成。我需要重写testdb还是有一个“开箱即用”的解决方案?我查看了zero-config设置(devservices),但这不允许我配置db。我不想再扩展springframework了。
如果你能用
@QuarkusTest
支持,它将启动您的应用程序,以便您可以使用像h2或derby这样的内存数据库。有一个测试支持通过quarkus测试资源自动启动h2数据库,请参阅quarkus测试指南的starting services before the quarkus application starts(在quarkus应用程序启动之前启动服务)部分,该部分解释了如何启动h2数据库,感谢io.quarkus.test.h2.H2DatabaseTestResource
.devservices也是一种很好的方法,它将在docker容器中运行一个真正的数据库,因此如果您没有配置任何数据源,而是使用quarkus jdbc扩展(如
quarkus-jdbc-postgresql
例如,它将在dev和test中为这个数据库运行一个docker容器。还有两件事可以帮助您实现您想要的:quarkus支持flyway或liquibase来管理数据库迁移,并且您可以通过
%test
配置概要文件(例如在测试时运行专用的sql导入文件)。如果我使用hibernate而没有华丽的外观,我需要一把刀吗?
如果您需要一个dao,我建议您使用hibernate和panache,这是一个很好的扩展,可以很容易地在您的实体上实现dao。但这取决于您希望如何设计应用程序。这取决于你是否使用一个dao,以及是否使用hibernate和panache来处理你的dao。