[英]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异常的原因
回应您添加的子问题
ParameterizedType
)中获取注释定义,而不是来自集合的实际成员,这就是为什么它起作用的原因。 我不太确定这对字段定义有什么影响(它们仅出现在“ super”类中),但是这里没有“魔术”,只是普通的旧反射扫描。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.