1

我正在使用 Spring 3.2 和 Roo 1.2.3 通过 Hibernate 构建一个数据库支持的 Java 应用程序。我的数据库中的表之间有几个双向 OneToMany/ManyToOne 关系。当我使用@JoinColumn(通过 Roo 中的“字段引用”)设置关系的 ManyToOne 端时,会创建一个类型为相关实体(ManyToOne 中的“one”)的新字段。但是,一旦完成此操作,似乎就无法访问 ManyToOne 关系所基于的基础列值。当底层连接列包含应用程序所需的数据时(即当连接列包含产品库存编号时),这是一个问题。

有没有办法设置我的实体类,以便它的 ManyToOne 关系所基于的列仍然可以访问,而无需遍历新的 join 属性?如何为该列的值定义访问器方法?

这几天我一直在网上寻找这个问题的答案,但无济于事。在此先感谢您的帮助。

4

2 回答 2

0

只需使用 insertable=false 和 updateable=false 再次映射该列

于 2013-03-14T20:48:09.023 回答
0

使其更具体。可以执行 HQL-SELCT 并限制ManyToOne关系,而不需要在结果SQL中加入任何连接:

而不是使用加入

session.createQuery("FROM Person person WHERE person.adress.id = 42")

我们使用可以使用adress_id

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.LAZYand也是可选的@Nullable,但在使用它时要明确说明。我们能够加载Person具有特定Address(我们知道地址 id)的实体。但是我们不需要连接,因为 WHERE 子句不需要连接,初始获取也不需要连接(可以延迟获取地址)。

于 2020-04-07T13:13:19.480 回答