【问题标题】:Eclipselink @mapkey and @JoinFetch(JoinFetchType.OUTER) cannot co-exist?Eclipselink @mapkey 和 @JoinFetch(JoinFetchType.OUTER) 不能共存?
【发布时间】:2011-02-21 09:03:40
【问题描述】:

在 Customer.java 实体类中,我有以下代码:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "customer", fetch = FetchType.EAGER)
@MapKey(name = "key")
@JoinFetch(JoinFetchType.OUTER)
private Map<String, CustomerSuppInfo> suppInfoMap....

发现当我查询客户实体时,eclipselink 生成的 SQL 没有加入获取 CustomerSuppInfo 映射(它生成了 1 个 SQL 来选择客户表,然后另外 1 个 SQL 来通过 id 选择 supp_info 表) 我想要的只是生成 1 个 SQL 并选择整个与客户相关的字段,以便最大限度地减少 SQL 生成/EJB 调用的数量。

这两个注释不能共存吗? 我试图找到 JPA 文档,但似乎没有运气:(

【问题讨论】:

    标签: java orm jpa persistence eclipselink


    【解决方案1】:

    如果注释“@JoinFetch(JoinFetchType.OUTER)”没有导致 EclipseLink 为拥有的实体上的所有查询加入“suppInfoMap”,并且您没有使用 XML 覆盖此映射,那么这是一个错误。您应该提交一个 EclipseLink 错误。或者,您可以创建查询以直接使用“JOIN FETCH”JPQL 关键字加入“suppInfoMap”。

    【讨论】:

      【解决方案2】:

      查询示例

      导入 java.util.HashMap; 导入 java.util.Map;

      导入 javax.persistence.Entity; 导入 javax.persistence.GeneratedValue; 导入 javax.persistence.GenerationType; 导入 javax.persistence.Id; 导入 javax.persistence.MapKey; 导入 javax.persistence.OneToMany;

      @实体 公共课部{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 私人 int id; 私有字符串名称; @OneToMany(mappedBy="部门") @MapKey(name="name") 私人地图学生;

      public Department() {
          students = new HashMap<String, Student>();
      }
      
      public int getId() {
          return id;
      }
      
      public void setId(int id) {
          this.id = id;
      }
      
      public String getName() {
          return name;
      }
      
      public void setName(String deptName) {
          this.name = deptName;
      }
      
      public void addStudent(Student student) {
          if (!getStudents().containsKey(student.getName())) {
              getStudents().put(student.getName(), student);
              if (student.getDepartment() != null) {
                  student.getDepartment().getStudents().remove(student.getName());
              }
              student.setDepartment(this);
          }
      }
      
      public Map<String,Student> getStudents() {
          return students;
      }
      
      public String toString() {
          return "Department id: " + getId() + 
                 ", name: " + getName();
      }
      

      }

      文件:Student.java

      导入 javax.persistence.Entity; 导入 javax.persistence.GeneratedValue; 导入 javax.persistence.GenerationType; 导入 javax.persistence.Id; 导入 javax.persistence.ManyToOne;

      @实体 公共课学生{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 私人 int id; 私有字符串名称;

      @ManyToOne
      private Department department;
      
      public int getId() {
          return id;
      }
      
      public void setId(int id) {
          this.id = id;
      }
      
      public String getName() {
          return name;
      }
      
      public void setName(String name) {
          this.name = name;
      }
      
      
      public Department getDepartment() {
          return department;
      }
      
      public void setDepartment(Department department) {
          this.department = department;
      }
      
      public String toString() {
          return "Student id: " + getId() + " name: " + getName() + 
                 " with " + getDepartment();
      }
      

      }

      文件:Helper.java

      导入 java.sql.Connection; 导入 java.sql.DriverManager; 导入java.sql.ResultSet; 导入 java.sql.ResultSetMetaData; 导入 java.sql.Statement;

      公共类助手{ 公共静态无效检查数据()抛出异常{ Class.forName("org.hsqldb.jdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:hsqldb:data/tutorial", "sa", ""); 语句 st = conn.createStatement();

      ResultSet mrs = conn.getMetaData().getTables(null, null, null, new String[] { "TABLE" });
      while (mrs.next()) {
        String tableName = mrs.getString(3);
        System.out.println("\n\n\n\nTable Name: "+ tableName);
      
        ResultSet rs = st.executeQuery("select * from " + tableName);
        ResultSetMetaData metadata = rs.getMetaData();
        while (rs.next()) {
          System.out.println(" Row:");
          for (int i = 0; i < metadata.getColumnCount(); i++) {
            System.out.println("    Column Name: "+ metadata.getColumnLabel(i + 1)+ ",  ");
            System.out.println("    Column Type: "+ metadata.getColumnTypeName(i + 1)+ ":  ");
            Object value = rs.getObject(i + 1);
            System.out.println("    Column Value: "+value+"\n");
          }
        }
      }
      

      } }

      文件:Main.java

      导入 java.util.List;

      导入 javax.persistence.EntityManager; 导入 javax.persistence.EntityManagerFactory; 导入 javax.persistence.Persistence; 导入 javax.persistence.Query;

      公共类主要{ 静态 EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAService"); static EntityManager em = emf.createEntityManager();

      public static void main(String[] a) 抛出异常 { em.getTransaction().begin();

      Student student = new Student();
      student.setName("Joe");
      em.persist(student);
      
      Department dept = new Department();
      dept.addStudent(student);
      em.persist(dept);
      
      em.flush();
      
      
      
      
      
      
      Query query = em.createQuery("SELECT e FROM Student e");
      List<Student> list = (List<Student>) query.getResultList();
      System.out.println(list);
      
      query = em.createQuery("SELECT d FROM Department d");
      List<Department> dList = (List<Department>) query.getResultList();
      System.out.println(dList);
      
      em.getTransaction().commit();
      em.close();
      emf.close();
      
      Helper.checkData();
      

      } }

      文件:persistence.xml

      http://java.sun.com/xml/ns/persistence/persistence" version="1.0">

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-27
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多