JPA和"匿名"斯卡拉的课程

时间:2017-04-07 21:51:02

标签: scala hibernate anonymous-class

我有点卡住了,不明白发生了什么。 这个没有用

@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)

为什么呢?为什么hibernate不能识别我的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
          }
        })
      })
    })

为什么呢?孩子,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)
  }

1 个答案:

答案 0 :(得分:2)

你在这里做的是在Scala中匿名实例化一个类,以及......创建类Entity的匿名实现(比如在Java中匿名实例化接口)。

您可以通过在两种情况下打印班级名称println(myEntity.getClass)来查看

应用于原始类的注释不适用于匿名类(反射仍然可以在超类中找到它们,但这取决于扫描它们的代码)并且我猜这就是为什么你得到各种JPA异常< / p>

回复您添加的子问题

  • 关于快捷方式 - 为什么不为工厂使用伴随对象或将此类转换为case类(使用默认值),从而允许更好,更灵活的初始化。
  • 关于第二个对象图(并假设每个类都被注释) - 再次取决于反射代码如何处理它扫描的对象。它是可能的(并且更可能的是,鉴于它不会扫描集合中的每个成员以进行注释),它会从擦除类型中获取注释定义(可能在Java的反射API中将其FQDN类名称设置为ParameterizedType)集合而不是集合的实际成员,这就是它的工作原理。 我不确定它对字段定义的作用(它们只存在于“超级”类中),但这里没有“魔法”,只是简单的旧反射扫描。