2017-06-08 13 views
1

3つのエンティティの関係に問題があります。継承階層を持つことを試みていましたが、子クラス内では、親クラスオブジェクトのListを属性として参照しています。だから、私は子クラスのエンティティをマッパーテーブルにしたいと思います。マッパーテーブルには親との関連が示されます。これを行うにあたり私はたくさんの関係問題にぶち当たっていた 私はこの機能をエミュレートするサンプルプロジェクトを作成しました。SpringBoot + Hibernate Relationship issues

Automobile.java

import java.io.Serializable; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Inheritance; 
import javax.persistence.InheritanceType; 
import javax.persistence.OneToOne; 

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Automobile implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long Id; 

@OneToOne 
private Manufacturer manufacturer; 

@OneToOne 
private AutomobileType autotype; 

@OneToOne 
private LoanerCar loanerCarID; 

private String vin; 

//Getters and Setters, Arg Constructors, No-Arg Constructor, toString 
} 

LoanerCar.java

package com.example.demo.domains; 

import java.sql.Timestamp; 
import java.util.List; 
import javax.persistence.Entity; 
import javax.persistence.OneToMany; 

@Entity 
public class LoanerCar extends Automobile{ 

private static final long serialVersionUID = 1L; 
private String name; 
private Timestamp dateLoaned; 
private Timestamp dateReceived; 

@OneToMany 
private List<Automobile> alist; 

//Getters and Setters, Arg Constructors, No-Arg Constructor, toString 
} 

TotaledCar.java

import java.util.List; 
import javax.persistence.Entity; 

@Entity 
public class TotaledCar extends Automobile { 

private static final long serialVersionUID = 1L; 

private List<LoanerCar> eligibleLoaners; 

//ゲッターA NDセッター、Argのコンストラクタ、引数なしのコンストラクタ、のtoString }

AutomobileBaseRepository.java

import java.util.List; 
import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.repository.NoRepositoryBean; 
import com.example.demo.domains.Automobile; 
import com.example.demo.domains.Manufacturer; 

@NoRepositoryBean 

public interface AutomobileBaseRepository<T extends Automobile> extends JpaRepository<T, Long> { 
List<T> findByLoanerCarID(Long id); 

List<T> findByVinAndManufacturerAndLoanerCarID(String vin, Manufacturer manfacturer, Long id); 
} 

自動車、TotaledCar、LoanerCarリポジトリはAutomobileBaseRespoistoryを拡張し、およびNO方法を有していません。

LoaanerController.java

import java.util.List; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

import com.example.demo.domains.LoanerCar; 
import com.example.demo.domains.Manufacturer; 
import com.example.demo.domains.TotaledCar; 
import com.example.demo.repositories.LoanerCarRepository; 
import com.example.demo.repositories.ManufacturerRepository; 
import com.example.demo.repositories.TotaledCarRepository; 

@RestController 
public class LoanerController { 

    @Autowired 
    LoanerCarRepository loanerRepo; 

    @Autowired 
    TotaledCarRepository totaledCarRepo; 

    @Autowired 
    ManufacturerRepository manRepo; 


    @RequestMapping(value="/loaner/all", method = RequestMethod.GET) 
    public List<LoanerCar> loaners(){ 
     List<LoanerCar> list = loanerRepo.findAll(); 
     return list; 
    } 

    @RequestMapping(value="/loaner/{id}", method=RequestMethod.GET) 
    public LoanerCar getLoaner(@PathVariable Long id){ 
     LoanerCar loanerCar= loanerRepo.findOne(id); 
     return loanerCar; 
    } 


    @RequestMapping(value="/loaner", method=RequestMethod.GET) 
    public String response(@RequestParam("vin") String vin, @RequestParam("manufacturer") Long manfuacturerId, @RequestParam("loanerId") Long loanerId){ 
     Manufacturer manObj = manRepo.findById(manfuacturerId); 

     List<LoanerCar> loanerList = loanerRepo.findByLoanerCarID(loanerId); 
     List<TotaledCar> tlist = totaledCarRepo.findByVinAndManufacturerAndLoanerCarID(vin, manObj, loanerId); 

     for (TotaledCar junk : tlist){ 
      loanerList.addAll(junk.getEligibleLoaners()); 
     } 

     String strlist = loanerList.toString(); 
     return strlist; 
    } 
} 

だから、このマッピングの流れが、私はそれがデフォルトでヌルのloanerIdを持つことになります自動車を追加するときからのものであると仮定されます。 loanerIdに値を割り当てると、LoanerCarテーブルにマップされます。このテーブルには、親クラス/テーブルからのAutomobileIdがあり、loanerIdはLoanerCarクラス/テーブルにあります。したがって、LoanerCarテーブルでは、loanerIdはLoanerCarsの対象となる自動車のリストに関連付けられています。だから、Automobileには1つのloanerIdがあり、そのloanerIdは多くの自動車を運ぶことができます。そして、私のコントローラーの方法では、合計車と貸し手車の両方のリストを取得できます。私はそれが混乱するように聞こえるが、私は達成しようとしているこれを得ることを知っている。

スタックトレース

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at com.example.demo.SpringJpaInheritanceRelationshipsApplication.main(SpringJpaInheritanceRelationshipsApplication.java:10) [classes/:na] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    ... 16 common frames omitted 
Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at table: totaled_car, for columns: [org.hibernate.mapping.Column(eligible_loaners)] 
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:431) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:398) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.mapping.Property.isValid(Property.java:225) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:595) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.mapping.JoinedSubclass.validate(JoinedSubclass.java:44) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    ... 22 common frames omitted 
+0

上で任意のJPA関連の注釈を入れて、あなたはすでに春のライブラリを使用しているので、代わりにHibernateの春・データを使用してみましたが? – jalv1039

+0

はい私は、リポジトリを使用してspringデータjpaを使用しています。あなたはより具体的になりますか?私は春のデータにも関係の注釈があると信じています。しかし、私はそれらを置く場所に混乱しています。手元にある課題を考えてください。 – user3116769

答えて

0

あなたは(@Idアノテーションで決定)フィールドアクセスの戦略を使用しています。 、右サイドノートとして

private List<LoanerCar> eligibleLoaners; 

参照here

+0

LoanerCarクラスのフィールドを複合キーとして使用する場合は、forcedDiscrimnatorについて読みましたが、依存関係を見つけることができませんでした。それを使用する。また、List要素を別のテーブルとして作成します。そのデータを対応するテーブル内に保持することは可能ですか? – user3116769

+0

NP。私は、あなたは新しい質問としてそれを求めるべきだと思います。ちなみに、この答えは受け入れられたとマークしてください。 –

+0

Npありがとう – user3116769