2017-10-12 4 views
0

対応によって移入されませんCampaignEntity.classエンティティです:複合キーは、ここでID

@Entity 
@Table(name = "campaign_country") 
@IdClass(CampaignCountry.CampaignCountryPK.class) 
public class CampaignCountry { 
    @Id 
    @Column(name="campaign_id") 
    private Long campaignId; 
    @Id 
    @Column(name="country") 
    private String country; 

    public CampaignCountry(String country) { 
     this.country = country; 
    } 

    //getters and setters 

    static class CampaignCountryPK implements Serializable { 

     private Long campaignId; 

     private String country; 

     public CampaignCountryPK() {} 

     public CampaignCountryPK(Long campaignId, String country) { 
      this.campaignId = campaignId; 
      this.country = country; 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (this == o) return true; 
      if (o == null || getClass() != o.getClass()) return false; 

      CampaignCountryPK that = (CampaignCountryPK) o; 

      if (campaignId != null ? !campaignId.equals(that.campaignId) : that.campaignId != null) return false; 
      return country != null ? country.equals(that.country) : that.country == null; 
     } 

     @Override 
     public int hashCode() { 
      int result = campaignId != null ? campaignId.hashCode() : 0; 
      result = 31 * result + (country != null ? country.hashCode() : 0); 
      return result; 
     } 
    } 
} 

私は「とき、問題が来る:

@Entity 
@Table(name = "campaign") 
public class CampaignEntity implements Serializable { 

    @Id 
    @SequenceGenerator(name = "campaign_id_gen", sequenceName = "campaign_seq", initialValue = 1, allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "campaign_id_gen") 
    private Long id; 

    @OneToMany(cascade = CascadeType.REMOVE, mappedBy = "campaignId", fetch = FetchType.EAGER, targetEntity = CampaignCountry.class) 
    private List<CampaignCountry> countries; 

    @Column(name = "include_countries") 
    private Boolean includeCountries; 

    // getters & setters, toString, hashEquals 
} 

そして、ここでは、私がマップしようとしているCampaignCountry.classですm repository.saveAndFlush(campaignEntity)を呼び出します。必要に応じて国を保存しますが、CampaignIdは保存しません。それは常にnullです。

org.springframework.orm.jpa.JpaObjectRetrievalFailureException:ID domain.CampaignCountry$CampaignCountryPK[email protected]でdomain.CampaignCountryを見つけることができません。ここでは、ID [email protected]

でdomain.CampaignCountryを見つけることができません(それは何も関係している場合)、移行SQLスクリプトです:

ネストされた例外はjavax.persistence.EntityNotFoundExceptionです。

ここで何が間違っているのですか。campaignIdに対応するcampaignEntityのIDを設定するにはどうすればよいですか? @OneToManyアノテーションには何かがあると思いますが、正しく実装されていない可能性があります。

+0

'@OneToMany(cascade = CascadeType.ALL、mappedBy =" campaignId "、fetch = FetchType.EAGER、targetEntity = CampaignCountry.class)' – juvenislux

+0

エンティティクラスが奇妙に見えます。 – Frank

+0

@juvenislux助けてくれなかった。まだヌルです。 – Amiko

答えて

1

代わりに@EmbeddedIdを使用してみませんか? CampaignEntity変化その後

@Entity 
public class CampaignCountry implements Serializable { 

    @EmbeddedId 
    private CampaignCountryPK id; 

    @MapsId("campaignId") 
    @ManyToOne 
    @JoinColumn(name = "campaign_id") 
    private CampaignEntity campaignEntity; 
} 

@Embeddable 
public class CampaignCountryPK implements Serializable { 

    @Column(name = "campaign_id") 
    private long campaignId; 
    @Column(name = "country") 
    private String country; 
} 

@Entity 
@Table(name = "campaign_country") 
public class CampaignCountry implements Serializable { 

    @EmbeddedId 
    private CampaignCountryPK id; 

    @MapsId("campaignId") 
    @ManyToOne 
    @JoinColumn(name = "campaign_id") 
    private CampaignEntity campaignEntity; 
} 

へのマッピング:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "campaignEntity", fetch = FetchType.EAGER, targetEntity = CampaignCountry.class) 
private List<CampaignCountry> countries; 

あなたは同じようにオブジェクトを作成する必要があります。

List<CampaignCountry> countryList = new ArrayList<>(); 
CampaignEntity campaign = new CampaignEntity(); 

CampaignCountryPK pk1 = new CampaignCountryPK(); 
pk1.setCountry("Country 1"); 
CampaignCountry country1 = new CampaignCountry(); 
country1.setId(pk1); 
country1.setCampaignEntity(campaign); 

countryList.add(country1); 
campaign.setCountries(countryList); 

それとも、PKを作成するためのメソッドを作成することができます。

+0

あなたが言ったように私はやった。 @MapsIdをマッピングするときに参照先のエンティティに予期しない識別子のタイプがあります。com.newagesol.promotion.domain.CampaignEntity – Amiko

+0

は 'includeCountries'DBカラムですか? '@ Transient'とマークしようとすると、 – juvenislux

+0

はい、そうです。私はちょうどそれをチェックした。 – Amiko

関連する問題