我有点卡住了,不明白发生了什么。 这个没有用
@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)
}
答案 0 :(得分:2)
你在这里做的是在Scala中匿名实例化一个类,以及......创建类Entity
的匿名实现(比如在Java中匿名实例化接口)。
您可以通过在两种情况下打印班级名称println(myEntity.getClass)
来查看
应用于原始类的注释不适用于匿名类(反射仍然可以在超类中找到它们,但这取决于扫描它们的代码)并且我猜这就是为什么你得到各种JPA异常< / p>
回复您添加的子问题
ParameterizedType
)集合而不是集合的实际成员,这就是它的工作原理。
我不确定它对字段定义的作用(它们只存在于“超级”类中),但这里没有“魔法”,只是简单的旧反射扫描。