问题描述
我目前有两个对象ObjectA
和ObjectB
,它们通过@ManyToOne和@OnetoMany相互关联。但是,由于我不想在更新{/ {1}}时删除/更新ObjectB
,因此ObjectA
带有@Transient注释。当Querydsl生成Q类时,我注意到{@ 1}}由于@Transient字段而没有objectB
路径。
它看起来像这样:
ObjectA
QObjectA
ObjectB
objectB
控制器
public class ObjectA {
@ManyToOne
@Transient
private ObjectB objectB
}
我当前遇到的错误是
public class ObjectB {
@OnetoMany
private Set<ObjectA> objectAs
}
到目前为止,我已经尝试了@ QueryProperty,@ QueryInit和@QueryEmbedded,但对我没有任何帮助。 有没有办法使Querydsl生成@Transient对象的路径?
解决方法
您的映射无效。在任何托管属性上均不允许使用@Transient
。它不会阻止删除,只会阻止字段映射。即使QueryDSL为它生成了元模型,查询最终也会失败,因为这种映射对ORM毫无意义(例如Hibernate)。
由于ObjectA
是关系的所有者,因此,如果删除ObjectB
,则默认不会删除它所引用的ObjectA
。相反,它将{ObjectA
从逆映射(objectAs
)中删除-可以这么说。如果您想用其ObjectB
删除ObjectA
,则必须用@ManyToOne(cascade = REMOVE)
(或暗示这一点的东西,例如CascadeType.ALL
)专门注释该关联。
现在,对于逆关系而言,它有些微妙。删除ObjectB
时,您实际上可能希望删除ObjectA
。默认情况下,它将通过将其设置为NULL
来清除关联,但是显然,非空约束可以防止这种情况。如果您想用ObjectA
删除ObjectB
,则可以通过@OneToMany(orphanRemoval = true)
对其进行映射。