【问题标题】:How can I access the underlying column after defining a @ManyToOne relationship on it in Spring?在 Spring 中定义 @ManyToOne 关系后,如何访问基础列?
【发布时间】:2013-03-14 20:46:16
【问题描述】:
我正在使用 Spring 3.2 和 Roo 1.2.3 通过 Hibernate 构建一个数据库支持的 Java 应用程序。我的数据库中的表之间有几个双向 OneToMany/ManyToOne 关系。当我使用@JoinColumn(通过 Roo 中的“字段引用”)设置关系的 ManyToOne 端时,会创建一个类型为相关实体(ManyToOne 中的“one”)的新字段。但是,一旦完成此操作,似乎就无法访问 ManyToOne 关系所基于的基础列值。当底层连接列包含应用程序所需的数据时(即连接列包含产品库存号),就会出现问题。
有什么方法可以设置我的实体类,以便它的 ManyToOne 关系所基于的列仍然可以访问,而无需遍历新的连接属性?如何为该列的值定义访问器方法?
几天来,我一直在网上寻找这个问题的答案,但无济于事。提前感谢您的帮助。
【问题讨论】:
标签:
java
spring
hibernate
spring-roo
spring-data-jpa
【解决方案1】:
只需使用 insertable=false 和 updateable=false 再次映射该列
【解决方案2】:
使它更具体。可以在生成的 SQL 中执行 HQL-SELCT 并限制 ManyToOne 关系,没有任何连接:
而不是使用加入
session.createQuery("FROM Person person WHERE person.adress.id = 42")
我们使用可以使用adress_idcolumn
session.createQuery("FROM Person person WHERE person.adressId = 42")
如果您指定一个额外的 adressId 字段,这将有效,该字段仅用作 Hibernate 的映射信息:
@Entity
@Access(AccessType.FIELD)
public class Person{
@Id
String id;
@JoinColumn(name = "adress_id")
@ManyToOne(fetch = FetchType.LAZY)
@Nullable
public Adress adress;
@Column(name = "adress_id", insertable = false, updatable = false)
private String adressId;
}
@Entity
@Access(FIELD)
public class Adress{
@Id
String id;
}
AccessType.FIELD 不是必需的(但我们可以在示例中保留 getter/setter)。 FetchType.LAZY 和 @Nullable 也是可选的,但要明确何时使用它。我们能够加载具有特定Address 的Person 实体(我们知道地址ID)。但我们不需要连接,因为 WHERE 子句不需要连接,初始获取也不需要(地址可以延迟获取)。