【问题标题】:JPA returns empty objectsJPA 返回空对象
【发布时间】:2018-08-03 14:02:15
【问题描述】:

我的用户模型

@Entity
@Table(name="users")
data class User(
        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long = -1,
        @Column(unique=true)
        val username: String) : Serializable

数据库中有两条记录

查询没问题。

[2018-02-23T14:32:07.066+0100] [Payara 4.1] [FINE] [] [org.eclipse.persistence.session./file:/Users/youri/Downloads/payara41/glassfish/domains/domain1/applications/Kwetter-1.0-SNAPSHOT/WEB-INF/classes/_kwetter.sql] [tid: _ThreadID=28 _ThreadName=http-thread-pool::http-listener-1(4)] [timeMillis: 1519392727066] [levelValue: 500] [[ 选择 ID,用户名 来自用户]]

但它输出两个空对象,而不是两个 User 对象

[{},{}]

我使用实体管理器的抽象道

@Stateless
abstract class Abstract<T : Serializable> {
    @PersistenceContext
    private lateinit var entityManager: EntityManager

    abstract fun getEntityClass(): Class<T>

    open fun find(id: Long): T {
        return entityManager.find(getEntityClass(), id)
    }

    // this returns the weird two empty objects
    open fun all(): List<T> {
        val builder = entityManager.criteriaBuilder
        val c = builder.createQuery(getEntityClass())
        c.from(getEntityClass())
        val query = entityManager.createQuery(c)

        return query.resultList
    }
}

【问题讨论】:

  • 这两个对象是什么类型的?
  • 它应该打印两个序列化的用户对象,但它打印两个空对象...
  • 是的,但字符串表示不是最可靠的调试方法。这些元素的类别是什么?即item::class 的结果是什么?它们似乎不是User 的类型。
  • @Moira User::class
  • 您将属性定义为 val 但它们必须是可变的。使用 var 而不是 val

标签: jpa kotlin


【解决方案1】:

您应该使用var 而不是val,因为Kotlin 不会为val 字段创建setter。 JPA 需要具有可变属性(这意味着 getter 和 setter)。

TLDR:使用var 而不是val

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2014-09-29
    • 2015-02-11
    • 2020-12-21
    • 2019-04-08
    • 2012-02-22
    • 2019-07-17
    • 2022-01-11
    相关资源
    最近更新 更多