【问题标题】: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 也是可选的,但要明确何时使用它。我们能够加载具有特定AddressPerson 实体(我们知道地址ID)。但我们不需要连接,因为 WHERE 子句不需要连接,初始获取也不需要(地址可以延迟获取)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 2021-06-15
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 2016-04-17
        • 2023-04-09
        相关资源
        最近更新 更多