如何通过@Transient

问题描述

我目前有两个对象ObjectAObjectB,它们通过@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)对其进行映射。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...