当前位置: 首页 > 知识库问答 >
问题:

Quakus以及如何实现内存、实体和DAO

许明朗
2023-03-14

我目前正在将我的数据库层(实体和DAO)从JavaEE迁移到Quakus(或者从wls迁移到OpenShift),并且不能完全理解一些细节:

目前我有目前的结构:

  • 信息类注册时间。爪哇

我的测试类注册了TimeDaoTest,它使用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(使用gradle)

>

  • 仍然需要一个实体类,但是EntityManagerFactory正在处理中,可以只注入数据源和EntityManger,对吗?

    我必须重写TestDB吗,还是有一个“现成”的解决方案?我查看了Zero配置设置(DevServices),但这不允许我配置数据库。我不想再扩展springframework了。

    如果我使用Hibernate而没有华丽的外观,我需要一把刀吗?

  • 共有1个答案

    戚兴邦
    2023-03-14

    我猜你在用斯波克做测试。

    Quarkus仅支持JUnit5,因此您应该尝试使用基于JUnit5的Spock 2.0-M5,如果可能,通过其Quarkus-JUnit5扩展使用Quarkus JUnit5支持。

    Quarkus和斯波克的支持有问题,你可以看。

    请注意,Quarkus不支持Groovy或Spock。

    作为一种选择,你也可以尝试这个QuarkusSpock扩展,不知道它的状态是什么,我只是通过谷歌搜索找到它。

    关于你的问题:

    实体类仍然是必需的,但EntityManagerFactory正在被关闭,Datasource和EntityManger可以被注入,对吗?

    如果您使用的是Quakus HiberNate ORM扩展,这是一个常规的HiberNate集成,所以是一个JPA实现,所以您需要定义JPA实体类。然后您可以注入一个EntityManager。您也可以注入一个Datassource,但是最好使用EntityManager,因为它提供了更高级别的集成。

    我必须重写TestDB吗,还是有一个“现成”的解决方案?我查看了Zero配置设置(DevServices),但这不允许我配置数据库。我不想再扩展springframework了。

    如果您可以使用@aqukusTest支持,它将启动您的应用程序,以便您可以使用H2或Derby这样的内存数据库。有一个测试支持通过Quarkus测试资源自动启动H2数据库,请参阅Quarkus测试指南中的“Quarkus应用程序启动前启动服务”部分,该部分解释了如何通过io.quarkus.test.h2启动H2数据库。H2数据库测试资源

    Devservices也是一种很好的方法,它将在docker容器中运行一个真正的数据库,因此如果您没有配置任何数据源,而是使用Quarkus JDBC扩展之一(例如Quarkus JDBC postgresql),它将在该数据库的开发和测试中运行一个docker容器。

    还有两件事情可以帮助您实现您想要的:Quakus支持flyway或liquibase来管理数据库迁移,并且您可以通过%test配置文件(用于示例在测试中运行专用的sql导入文件)获得特定的测试属性。

    如果我使用Hibernate而没有华丽的外观,我需要一把刀吗?

    如果你需要一个DAO,我建议使用Hibernate和Panache,这是一个很好的扩展,可以在你的实体上轻松实现DAO。但这取决于您希望如何设计应用程序。这取决于你是否使用DAO,以及是否为DAO使用Hibernate。

     类似资料:
    • 问题内容: 问题在标题中。下面我仅描述了我的一些想法和发现。 当我有一个非常简单的域模型(3个表没有任何关系)时,我所有的实体都没有实现Serializable。 但是,当域模型变得更加复杂时,我遇到了RuntimeException,它表示我的一个实体没有实现Serializable。 我使用Hibernate作为JPA实现。 我想知道: 它是特定于供应商的要求/行为吗? 我的可序列化实体会怎样

    • 我的quarkus概念验证中的JPA实体出现错误。 我发现了这个帖子: 如何在Quarkus中为外部模块中的类创建Jandex索引 我按照SOF的回答做了,这也在日志中: 一个空的META-INF/beans。xml 但我还是收到了上面的警告。 我真正想要的是: 我如何明确地告诉quarkus我的JPA实体的位置。 我的主要目标是减少启动时间,所以我尽量避免(过度)扫描。 我使用的是Gradle,

    • 问题内容: 我在Go中实现了HTTP服务器。 对于每个请求,我需要为一个特定的结构创建数百个对象,并且我有大约10个这样的结构。因此,按照Go实现完成请求后,将对其进行垃圾回收。 因此,对于每个请求,将分配和释放大量的内存。 相反,我想实现内存池以提高分配端以及GC端的性能。 在请求开始时,我将从池中取出并在请求处理后放回去 从池实施方面 如何分配和取消分配特定类型结构的内存? 如何跟踪此内存已分

    • 本文向大家介绍详解KMP算法以及python如何实现,包括了详解KMP算法以及python如何实现的使用技巧和注意事项,需要的朋友参考一下 算法思路 Knuth-Morris-Pratt(KMP)算法是解决字符串匹配问题的经典算法,下面通过一个例子来演示一下: 给定字符串"BBC ABCDAB ABCDABCDABDE",检查里面是否包含另一个字符串"ABCDABD"。 1.从头开始依次匹配字符,

    • 重写Compariable接口的compareTo()方法的最佳方法是什么?此外,当我们可以编写自己的compareTo()方法而无需实现时,为什么还要实现可比较的接口呢。以以下座椅类别为例: 尽管我们没有实现可比接口,但上述工作仍然有效,那么我们为什么要实现它呢?