2017-01-03 10 views
2

Spring JPAがLAZYプロパティMyChildEntity.myParentEntityを初期化しないのはなぜですか(すべてのフィールドはnullです)?Spring JPAはトランザクション内でも遅延プロパティを初期化しません

私はHibernate.initialize@Transactionalを使用しようとしましたが、それは役に立ちません。

私のサービス:

@Service 
@Transactional 
public class MyService { 

    @Resource 
    private MyChildEntityRepository myChildEntityRepository; 

    @Resource 
    private MyParentEntityRepository myParentEntityRepository; 

    @PostConstruct 
    public void init() { 
     MyParentEntity p = myParentEntityRepository.save(new MyParentEntity("my name")); 

     myChildEntityRepository.save(new MyChildEntity(p, "first value")); 
     myChildEntityRepository.save(new MyChildEntity(new MyParentEntity(1L, "another name"), "another value")); 

     // At this point both MyChildEntity's are in database and have correct foreign key value 
     List<MyChildEntity> result = myChildEntityRepository.findAll(); 
     //even this doesn't help, myParentEntity property still has all fields equals to null 
     Hibernate.initialize(result.get(0).getMyParentEntity()); 

     MyParentEntity p2 = result.get(0).getMyParentEntity(); 

     //trigger proxy's method to initialize lazy field 
     System.out.print(p2.getName()); // null 
     System.out.println(p2.getId()); // null 

     // PROBLEM: p2 has all fields equals null 
     // the same for result.get(1) 

     // BUT, this works correct - returns (1L, "my name") entity 
     myParentEntityRepository.findAll(); 
    } 
} 

子エンティティ:

@Entity 
public class MyChildEntity { 

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

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "my_parent_entity_id", referencedColumnName = "id") 
    private MyParentEntity myParentEntity; 

    @Column 
    private String value; 

    // constructors, getters, setters... 

親エンティティ:関連企業が使用して データベースから取得する必要があるとき

@Entity 
public class MyParentEntity { 

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

    @Column 
    private String name; 

    //constructors, getters, setters... 
+0

あなたは@JoinColumnが不足していますか? – BhathiyaW

+0

@BhathiyaW \ @JoinColumnと同じ問題がありました(私は質問を更新しました)。最後に、私はそれがIntellijデバッガの問題であることを認識しました、私の悪い –

答えて

0

fetch属性を示しjavax.persistence.FetchType列挙型。 FetchType.EAGERは、エンティティの取得時にJPA プロバイダが値を取得する必要があることを意味します。一方、FetchType.LAZY は、プロパティ が最初にアクセスされたとき(つまり、データベースへのトリップを保存しない場合がある)にのみ値を待機してフェッチするJPAプロバイダへのヒントとして役立ちます。 JPAプロバイダ は遅延ロードをサポートする必要はないため、これらの値はとにかく読み込まれる可能性があります。

出典:ニコラス・S・ウィリアムズ

編集して、WebアプリケーションのためのプロフェッショナルのJava:

私は本当に私は長い間、このかかっお詫び申し上げます。私は間違っていると思います。親エンティティに子エンティティのインスタンスが表示されません。

public class MyParentEntity { 
... //other fields 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "myParentEntity") 
private Set<MyChildEntity> myChildEntities = new HashSet<MyChildEntity>; 
... //other fields or constructors or getters or setters 
...  
} 

これはうまくいきます。そうでない場合は、MyChildEntityクラスに@JoinColumnという奇妙な注釈があります。referencedColumnNameとなります。私はそれが何であるか分からない。削除してください。

おかげ

+0

ありがとうございました。しかし、問題は私が遅延プロパティを全くフェッチできないことです。私はSpring JPAを通してフィールドを初期化できないことを意味する –

関連する問題