更新がNullPointerExceptionが冬眠withiと春ブーツ
私は@ sainrの答えConverting Hibernate proxy to real entity objectは、問題を解決していることに注意したいと思いますFetchType.LAZYで発生します。しかし、このシーンの背後にある問題は、final
という修飾語を持つSiteEntity
です。setControllerEntity
とgetControllerEntity
です。これは私の質問では持ちませんでした。そして私は謝罪します。
final
修飾子を削除します。その後、Hibernateはプロキシオブジェクトを正常に初期化できます。
説明は、別のanswerのStack Overflowで見つけることができます。
私は、デバイスの実体を発見した後
@Entity
@Table(name = "controller")
public class ControllerEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, updatable = false)
private long id;
}
@Entity
@Table(name = "site")
public class SiteEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "controller_id", nullable = false)
private ControllerEntity controllerEntity;
}
@Entity
@Table(name = "device")
public class DeviceEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "site_id", nullable = true)
private SiteEntity siteEntity;
}
を次のように3つのエンティティを持って、私はそれから直接controllerEntity
を取得しよう。
final DeviceEntity deviceEntity1 = deviceRepository.findOne(1L);
System.out.println(deviceEntity1.getSiteEntity().getControllerEntity().getId());
しかし、それはsiteEntity
でnull
controllerEntity
によって引き起こされるjava.lang.NullPointerException
結果。
また、siteRepositoy
を使用してsiteEntityをもう一度フェッチしようとしても、それのcontrollerEntity
はまだnull
です。
DeviceEntityとSiteEntityの両方からfetch = FetchType.LAZY
を削除した後、NPEはもう発生しません。
しかし、それは奇妙に思えますし、意味がありません。 hibernateが正しい値を取得することを期待しながら、FetchType.LAZY
を使用できますか?
ありがとうございました。
ありがとう。それは実際に重いオブジェクトを含んでいません。私は代わりにEAGERに切り替えます。しかし、重いオブジェクトやManyToMany、OneToManyマッピングなど、FetchType.LAZYが必要な場合は、休止セッションを閉じたり、「プロキシオブジェクトを実際のオブジェクトに変換する」ことを避けるために、そこに行きますか?ありがとう – Chiu
@Chiu 'TransactionTemplate'内で使うことができます(ホルダーオブジェクトをロードし、遅延した子を' @ Transactional'としてアクセスするメソッドをマークしてください) – sainr
「Hibernateプロキシを実体に変換するオブジェクト "は問題を解決します。しかし、シーンの背後にある問題は、私の 'SiteEntity'が' setControllerEntity'と 'getControllerEntity'の' final'修飾子を持つことです。 'final'修飾子を削除します。その後、Hibernateはプロキシオブジェクトをちょうど良いものに初期化できます。 – Chiu