1

UserControllerSessionScopedBeanに次のコードがあります

public void addItemToBundle(ItemEntity item){
    //System.out.println(item.getTitle());
    try {
        em.getTransaction().begin();
        UserEntity user = em.find(UserEntity.class, this.username);
        BundleEntity bundle = new BundleEntity();
        BundleEntityPK compositePk = new BundleEntityPK();
        compositePk.setCheckedOutDate(new Date());
        compositePk.setItemId(item.getItemId());
        compositePk.setUsername(user.getUsername());
        bundle.setId(compositePk);
        Set<BundleEntity> bundles = new HashSet<BundleEntity>();
        bundles.add(bundle);
        user.setBundleEntities(bundles);        
        em.persist(user);
        em.flush();
        em.getTransaction().commit();
    } finally {
    }
}


public String addToBundle(){        
    try {
        addItemToBundle(item);
    } catch (NullPointerException e) {
        e.getMessage();
    }

    return null;
}

このコードはprivate ItemEntity item;、次のJSFマークアップによって渡されるものを使用します。

<p:commandLink action="#{itemController.item}">
    <f:setPropertyActionListener target="#{itemController.selectedItem}" value="#{movie}" />
</p:commandLink>

(この例ではPrimeFacesを使用しています)問題は、addItemToBundleがコンソールでSQLコードを呼び出さず(FINEを有効にしている)、バンドルが作成されたり、ユーザーに追加されたりしないことです。また、UserEntityでcascadeTypeを設定しようem.persist(user)としましたが、うまくいきませんでした。em.flush()

@OneToMany(mappedBy="userEntity",cascade=CascadeType.PERSIST)
private Set<BundleEntity> bundleEntities;

ありがとう!

4

1 に答える 1

3

あなたはこれを知っています:

try {
    addItemToBundle(item);
} catch (NullPointerException e) {
    e.getMessage();
}

非常に悪い習慣ですよね?たぶん、それがここでの問題です。NPE に遭遇しても、まったく気付かないのです。

少なくとも例外をログに記録して、そこで何が起こっているかを確認する必要があります (デモ目的で、stdout を使用しました。お気に入りのログ フレームワークに置き換えてください)。

try {
    addItemToBundle(item);
} catch (NullPointerException e) {
    System.err.println(e.getMessage()); //use logger here
}
于 2012-05-03T13:39:10.567 に答える