quarkus以及如何在内存、实体和dao中实现

ny6fqffe  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(552)

我目前正在将我的数据库层(实体和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而没有华丽的外观,我需要一把刀吗?

ru9i0ody

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。

相关问题