2017-07-30 11 views
1

を取得するために失敗し、私は、DBを処理するためにJPAを使用しています。私は2つのエンティティを持っていると春JPA多対多の関係は、私は春にアプリを開発してきたデータ

パートナーエンティティ

@Entity 
public class Partner { 

@ManyToMany() 
private List<Tenant> tenants; 

public List<Tenant> getTenants() { 
    return tenants; 
} 

public void setTenants(List<Tenant> tenants) { 
    this.tenants = tenants; 
} 

} 

テナントエンティティ

@Entity 
public class Tenant { 
... 
} 

は、これら2つのエンティティがPartnerServiceTenantServiceサービスによって公開されている次のように彼らがいます。

別のサービスクラスでは、PartnerServiceからパートナーを取得しています。partner.getTenants()を呼び出すと、0個の要素のリストが返されます。しかし、特定のパートナーには2人のテナントが存在するというデータベースがあります。

@Service 
public class DBOutboundInjector implements OutboundInjector { 

private final ApplicationContext context; 

@Autowired 
public DBOutboundInjector(ApplicationContext context) { 
    this.context = context; 
} 

@Override 
@Transactional 
public boolean insertEntry(Long partnerId) { 

    PartnerService partnerService = context.getBean(PartnerService.class); 

      Partner partner = partnerService.getPartnerById(partnerId); 
      List<Tenant> partnerTenants = partner.getTenants(); 
... 
    } 
} 

答えて

0

代替次の選択肢を参照してください、次のように私のサービスクラスは、1:@ManyToMany FetchType.EAGER

@Entity 
public class Partner { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long id; 

    public Partner() { 
    } 

    public Partner(String name, String location, List<Tenant> tentans) { 

     this.name = name; 
     this.location = location; 
     this.tenants = tentans; 
    } 


    @ManyToMany(fetch = FetchType.EAGER) 
    private List<Tenant> tenants; 

オルタナティブ2を使用してみてください:パートナーを得るためにPartnerRepositoryに新しいメソッドを追加します。関連するテナントオブジェクトリストを取得します。

@Repository 
public interface PartnerRepository extends JpaRepository<Partner,Long> { 

    @Query("SELECT p FROM Partner p JOIN FETCH p.tenants WHERE p.id=(:id)") 
    public Partner findByIdFetchTenant(@Param("id") Long id); 

これは、テナントのリストを取得する方法のルーチンである、あなたはParentServcieあなたの中のリポジトリをAutowireでき

partner = partnerRepository.findByIdFetchTenant(partner.getId()); 
System.out.println("One Partner" + partner); 
System.out.println(partner.getTenants()); 

EDIT

私はこの場合イムには、完全な例を共有しています使用した春ブーツ、ウェブ、H2データベース、春のJPA

application.properties

spring.h2.console.enabled=true 
spring.h2.console.path=/h2-console 
spring.datasource.url:jdbc:h2:mem:~/test 

Partner.class

@Entity 
public class Partner { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long id; 

    public Partner() { 
    } 

    public Partner(String name, String location, List<Tenant> tentans) { 

     this.name = name; 
     this.location = location; 
     this.tenants = tentans; 
    } 


    @ManyToMany(fetch = FetchType.EAGER) 
    private List<Tenant> tenants; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 


    private String name; 

    private String location; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getLocation() { 
     return location; 
    } 

    public void setLocation(String location) { 
     this.location = location; 
    } 

    public List<Tenant> getTenants() { 
     return tenants; 
    } 

    public void setTenants(List<Tenant> tenants) { 
     this.tenants = tenants; 
    } 

    @Override 
    public String toString() { 

     return "Partner{" + 
       "id=" + id + 
       ", name='" + name + '\'' + 
       ", location='" + location + '\'' + 

       '}'; 
    } 
} 

Tenant.class

@Entity 
public class Tenant { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long id; 

    public Tenant() { 

    } 

    @Override 
    public String toString() { 
     return "Tenant{" + 
       "id=" + id + 
       ", name='" + name + '\'' + 
       ", description='" + description + '\'' + 
       '}'; 
    } 

    public Tenant(String name, String description) { 

     this.name = name; 
     this.description = description; 

    } 

    private String name; 

    private String description; 



    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 


} 

PartnerRepository.class

@Repository 
public interface PartnerRepository extends JpaRepository<Partner,Long> { 

    @Query("SELECT p FROM Partner p JOIN FETCH p.tenants WHERE p.id=(:id)") 
    public Partner findByIdFetchTenant(@Param("id") Long id); 

} 

TenantRepository.class

@Repository 
public interface TenantRepository extends JpaRepository<Tenant,Long> { 
} 

MyApp.class

@SpringBootApplication 
public class MyApp { 

    private static final Logger logger = LoggerFactory.getLogger(MyApp.class); 

    public static void main(String[] args) { 
      SpringApplication.run(MyApp.class, args); 
    } 


    @Bean 
    public CommandLineRunner runner(TenantRepository tenantRepository, PartnerRepository partnerRepository){ 
     return (args) -> { 

      logger.info("Creating Data Many to Many..."); 
      Tenant tenant1,tenant2,tenant3 = null; 
      Partner partner=null; 


      tenant1 = new Tenant("tenant1","tenant1"); 
      tenant2 = new Tenant("tenant2","tenant2"); 
      tenant3 = new Tenant("tenant3","tenant3"); 
      tenantRepository.save(tenant1); 
      tenantRepository.save(tenant2); 
      tenantRepository.save(tenant3); 

      partner = new Partner("partner1","partner location", Arrays.asList(tenant1,tenant2,tenant3)); 
      partnerRepository.save(partner); 

      partner = partnerRepository.findByIdFetchTenant(partner.getId()); 

      System.out.println("One Partner" + partner); 
      System.out.println(partner.getTenants()); 

     };}} 

のpom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.boot.spring</groupId> 
    <artifactId>myjpademo</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>myjpademo</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.4.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-devtools</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 


</project> 

よろしく。

+0

からこれを見つけた

@Entity public class Subject { private int id; private String name; private Set<Student> students; @Id @GeneratedValue(strategy = GenerationType.AUTO) public int getId() { return id; } @ManyToMany(mappedBy = "subjects") public Set<Student> getStudents() { return students; } } 

@Entity public class Student{ private int id; private String name; private Set<Subject> subjects; @Id @GeneratedValue(strategy = GenerationType.AUTO) public int getId() { return id; } @ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "student_subject", joinColumns = @JoinColumn(name = "student_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "subject_id", referencedColumnName = "id")) public Set<Subject> getSubjects() { return subjects; } public void setSubjects(Set<Subject> subjects) { this.subjects = subjects; } } 

は、 '= FetchType.EAGER'が同じ結果を与えるフェッチ。 2番目の提案をすると、パートナーを返すことさえありません。カスタムクエリが実行されていないようです。 – rnavagamuwa

0

単なる例ブローに従ってください。学生と被写体との多対多の関係があります。設定後のmany to many relationship in spring data jpa

+0

回答ありがとうございますが、これはうまくいきません。多分、問題は私が 'PartnerService' beanを取得する方法にあります。 – rnavagamuwa