2017-07-31 17 views
0

ためのクエリを保存します。カスタム、私は2つのエンティティを持って春データ(HibernateはJPA)

public interface WeeklyBoxOfficeRepository extends 
CrudRepository<WeeklyBoxOffice, String> { 
    Iterable<WeeklyBoxOffice> findByCountryOrderByWeeklyGrossDesc(String country); 
} 

既存のfindメソッドは、左結合のように動作します。これはまさに私が必要とするものです。しかし、どのようにムービーオブジェクトを保存せずにWeeklyBoxOfficeオブジェクトを保存するには? WeeklyBoxOfficeLiteを作成するという考えはありません。 entity.WeeklyBoxOffice.movi​​e - >エンティティ: - : org.hibernate.TransientPropertyValueException: 紅潮前に一時的なインスタンスを保存するオブジェクトが 保存されていない一時的なインスタンスを参照する今では例外

org.springframework.dao.InvalidDataAccessApiUsageExceptionを与えます。映画;ネストされた 例外java.lang.IllegalStateExceptionです: org.hibernate.TransientPropertyValueException:オブジェクトが 保存されていない一時的なインスタンスを参照する - 紅潮前に一時的なインスタンスを保存します。entity.WeeklyBoxOffice.movi​​e - > entity.Movie ...によって引き起こさ: org.hibernate.TransientPropertyValueException:オブジェクトは 保存されていない一時的なインスタンスを参照する - 紅潮前に一時的なインスタンスを保存します。WeeklyBoxOffice.movi​​e - > entity.Movie

はネストされたムービーを無視する方法保存のために何とかNativeQueryを使用することが可能ですオブジェクト?

+0

あなたの持続またはマージ方法を表示することができます? – Ashish451

+0

デフォルトのCRUDリポジトリインプラントを使用 –

+0

あなたのAPIに送るデータ/ JSONは何ですか? –

答えて

1

を削除、imho ...

しかし、とにかくt彼の回避策は助けることができます...

私はあなたにもあなたが最初 MovieRepositoryを作成し、このリポジトリを使用してムービーを保存してから使用して WeeklyBoxOfficeを保存する必要が

{ 
    "country": "xxxxxx", 
    "name": "xxxxxxxx", 
    "weeklyGross": "xxxxx", 
    "weeklyChange": "xxxxxx", 
    "movie": { 
     "name": "xxxxxx", 
     "imageLink": "xxxxx" 
    } 
} 

ようWeeklyBoxOffice JSONで映画のJSONを送信していると思う

public class WeeklyBoxOfficeService { 

    @Autoware 
    private WeeklyBoxOfficeRepo repo; 

    public WeeklyBoxOffice saveWithoutMovie(WeeklyBoxOffice weeklyBoxOffice) { 

     weeklyBoxOffice.setMovie(null); // 'unlink' movie from BO 
     repo.save(weeklyBoxOffice); // save BO without movie 
    } 
} 

@RestController 
@RequestMapping("/weeklyBoxOffice") 
public class WeeklyBoxOfficeController { 

    @Autoware 
    private WeeklyBoxOfficeService service; 

    @PostMapping 
    public ResponseEntity<?> saveWithoutMovie(@RequestBody WeeklyBoxOffice weeklyBoxOffice) { 

     WeeklyBoxOffice result = service.saveWithoutMovie(weeklyBoxOffice); 
     return ResponseEntity.ok(result); 
    } 
} 
0

save()操作を呼び出す前にnullフィールドにmovieフィールドを設定するだけではどうですか?
このように、Hibernateは、フラッシュ中にHibernateを無視します。

+0

私は@JsonIgnoreProperties(ignoreUnknown = true)でJSONからこのオブジェクトを構築しているので、フィールドはデフォルトでnullであると思いますか? –

+0

このHibernateエラーメッセージがある場合、それはnullではないことを意味します。それを確認してください。 – davidxxx

0

使用この

public void updateSample(EntityObj entityObj) { 
      sql = "UPDATE Table clm SET clm.status ='"+entityObj.getStatus()+"'"; 
      sql +=" WHERE clm.id in ("+entityObj.getId()+")"; 
      Query q = em.createQuery(sql); 
      msg = q.executeUpdate(); 
    } 

OR

のようなネイティブクエリの更新何かあなたがmovieとの関連からカスケードを削除した場合、その後、あなたはこのエラーを取得するべきではありませんCascadeType

@OneToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "name") 
private Movie movie; 
0

ウィークリーボックスオフィスリポジトリ like this

@Autowired 
    WeeklyBoxOfficeRepository weeklyBoxOfficeRepository; 
    @Autowired 
    MovieRepository movieRepository; 
    public WeeklyBoxOffice saveWeeklyBoxOffice(WeeklyBoxOffice weeklyBoxOffice) { 
      movieRepository.save(weeklyBoxOffice.getMovie()); 
      return weeklyBoxOfficeRepository.save(weeklyBoxOffice); 
    } 

他の解決策は、あなたが

weeklyBoxOfficeRepository.save(weeklyBoxOffice); 

この行は自動的に保存されますのみ1行を使用して、このJSONを保存するためCascadeType.Allを使用することができ、またweeklyBoxOfficeに映画の名前(ID)を割り当てます。

関連する問題