2017-05-08 21 views
0

私はHibernateを初めて使用しており、= nエンティティモデルからコレクションを取得しようとすると、 、鉛の変換エラー:遅延コレクションの遅延初期化に失敗しました:プロキシを初期化できませんでした - セッションなし

エラーがリードを変換発生しました: - 私は@Transactionalが、私の避難所を追加しようとしました

なしセッション[...]プロキシを初期化できませんでした:なまけ役割のコレクションを初期化に失敗しました何の成功もなかった。

関連するコード:

Policy.java

@Entity 
@Table(name = "policy") 
public class Policy { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @OneToMany(mappedBy = "policy") 
    private Set<Item> items = new HashSet<>(); 
    ... 
} 

IntercomApiImpl

@Component 
public class IntercomApiImpl implements IntercomApi { 
    private final String apiToken; 
    private final PolicyFeeDao policyFeeDao; 
    private final SimpleDateFormat dobFormat; 

    @Autowired 
    public IntercomApiImpl(@Qualifier("intercomApiToken") String apiToken, 
     PolicyFeeDao policyFeeDao) { 
     this.apiToken = apiToken; 
     Intercom.setToken(this.apiToken); 
     this.policyFeeDao = policyFeeDao; 
     this.dobFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    } 

    private Map<String, CustomAttribute> getPolicyAttrs(Policy policyToPay) { 
     Map<String, CustomAttribute> customAttrs = Maps.newHashMap(); 
     Set<Item> items = policyToPay.getItems(); 

     customAttrs.put("item_count", 
     CustomAttribute.newIntegerAttribute("item_count", items.size())); 

     return customAttrs; 
    } 
} 

また、私はこれが(私はそれが関連性のわからない)に設定している:

@Bean 
public LocalSessionFactoryBean sessionFactoryBean() { 
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
    sessionFactoryBean.setDataSource(dataSource()); 
    sessionFactoryBean.setPackagesToScan("com.app.model"); 
    sessionFactoryBean.setHibernateProperties(hibernateProperties()); 
    return sessionFactoryBean; 
} 

protected Properties hibernateProperties() { 
    Properties properties = new Properties(); 
    properties.setProperty("hibernate.dialect", getProperty("hibernate.dialect")); 
    return properties; 
} 

@Bean 
public HibernateTransactionManager transactionManager() { 
    return new HibernateTransactionManager(sessionFactoryBean().getObject()); 
} 

getPolicyAttrs()に@Transactionalを追加しようとしましたが、動作しませんでした。私の欠点は何ですか?

答えて

0

@Transactionalこの場合、ポリシーをフェッチしていないため、この場合はパラメータとして渡しているため、この場合は機能しません。

OneToManyの関係をEAGERに変更することができます。そのため、子オブジェクトは常に親でフェッチされるため、パフォーマンス上の問題が発生する可能性があります。あなたが怠惰なそれを維持したい場合は、明示的Hibernate.initialize()を使用することによって、それを初期化するために怠惰なコレクションを呼び出す必要があります。

Hibernate.initialize(policyToPay.getItems());