繁体   English   中英

JPA和scala中的“匿名”类

[英]JPA and “anonymous” classes in scala

我有点卡住,不知道发生了什么。 这个不起作用

@Entity
@DynamicInsert
@DynamicUpdate
@SelectBeforeUpdate
@Table
class Entity {
  @Column(nullable = false)
  var owner: String = _
}


    val myEntity = new Entity() {
            owner = "some owner 1"
          }
      session.persist(myEntity)

Hibernate抛出异常:

java.lang.IllegalArgumentException: Unknown entity:persistence.dao.EntityDaoTest$$anonfun$13$$anonfun$14$$anon$5
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:777)

这个作品:

val myEntity = new Entity()
entity.owner = "some owner 1"
session.persist(myEntity)

为什么? 休眠为什么无法识别我的Entity实例?

UPD:@Sheinbergon,谢谢,很明显。 我完全忘记了注释的丢失。 是否可以通过一些快捷方式设置实体字段? 写作

val myEntity = new MyEntity()
myEntity.owner = "some owner"
myEntity.someOtherProperty = "value"

超级无聊

还有一个问题这个有效:

val parent = new Parent
    parent.owner = "Our parent"
    parent.addChild(new Child() {
      name = "First parent's child"
      addGrandChild(new GrandChild() {
        name = "Grand child name"
        addGrandGrandChild(new GrandGrandChild() {
          name = "Grand Grand child name"
          address = new Address() {
            id = 1L
          }
        })
      })
    })

为什么? Child,GrandChild,GrandGrandChild也匿名创建。 addChild,addGrandChild,addGrandGrandChild只是列表更改器。

def addChild(child: Child): Unit = {
    if (children == null) {
      children = new util.ArrayList[Child]()
    }
    if (Option(child.parent).isEmpty) {
      child.parent = this
    }
    children.add(child)
  }

您在这里所做的是在Scala中匿名实例化一个类,并且...创建了类Entity的匿名实现(例如,在Java中匿名实例化一个接口)。

在两种情况下,都可以通过打印类名称println(myEntity.getClass)来查看它

应用于原始类的注释不适用于匿名类(反射仍可以在超类中找到它们,但这取决于扫描它们的代码),我想这就是为什么您会得到各种JPA异常的原因

回应您添加的子问题

  • 关于快捷方式-为什么不为工厂使用配套对象或将此类转换为case类(具有默认值),从而实现更好,更灵活的初始化。
  • 关于第二个对象图(并假设每个类都带有注释)-再次取决于反射代码如何对待其扫描的对象。 有可能(而且更可能是因为它不会扫描集合的每个成员以获取注释),它从集合的已擦除类型(可能是将其FQDN类名作为Java的反射API中的ParameterizedType )中获取注释定义,而不是来自集合的实际成员,这就是为什么它起作用的原因。 我不太确定这对字段定义有什么影响(它们仅出现在“ super”类中),但是这里没有“魔术”,只是普通的旧反射扫描。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM