0

複数の関連画像を持つ User エンティティを持つ画像アップロード/ストア アプリケーションがあります ( List<Image> imagesOneToMany 関係を使用)。Home.jspiteratorの strutsタグを使用して、セッション中のユーザーの画像を繰り返し処理しています。

<s:iterator value="#session['user'].images" status="itStatus">
<s:property value="imageid"/>
<s:property value="name"/>
<s:url action="GetImageAction" var="imgUrl">
<s:param name="imageId" value="imageid"></s:param>
</s:url>  
<li>
<img src="<s:property value="#imgUrl"/>"/>
</li>
</s:iterator>

アップロード フォームは同じページにあるため、ユーザーがログインすると、アップロード済みの画像が表示され、新しい画像をアップロードすることもできます。

これが私の問題です。新しい画像がアップロードされると、同じページが更新されて彼の画像が表示されますが、最近アップロードされた画像は表示されません (壊れているように見えます) が、以前にアップロードされたすべての画像を見ることができます。これは、この場合、 のimageIdフィールドが正しい ID ではなくImage値を持っているためです。action は、param を使用して画像から入力ストリームを設定します0GetImageActionimageId

Imageクラスは次のとおりです。

@Entity(name="Images")
public class Image implements Serializable {    
    private long imageid;
    private String name;
    private byte[] image;
    private static final long serialVersionUID = 1L;

    public Image() {
        super();
    }   

    public Image(String name, byte[] image) {
        super();
        this.name = name;
        this.image = image;
    }

    @Id  
    @GeneratedValue
    @Column(name="Id")
    public long getImageid() {
        return this.imageid;
    }

    public void setImageid(long id) {
        this.imageid = id;
    }
        ...
} 

これは、反復された新しいオブジェクトが、生成された Id ではなくImageデフォルトの long 値を持っているためだと推測しています ( のような他のフィールドの値にアクセスできます)。どうしてこれなの?結果が表示されるまでに画像は既に保持されているため、Id 値を正しく取得する必要はありませんか? ここで何が間違っていますか?0name

助けてください。ここで単純なものが欠けているかもしれませんが、それは解決されません。

編集: UserAddImageAction

public class UserAddImageAction implements SessionAware {
    private User user;
    private Map session;
    private File photo;
    private String photoContentType;
    private String photoFileName;

    public String execute() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("StrTest1");
        EntityManager em = emf.createEntityManager();
        EntityTransaction etx = em.getTransaction();

        try {           
            BufferedInputStream i = new BufferedInputStream(new FileInputStream(photo));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int c;
            while((c=i.read()) != -1) {
                baos.write(c);
            }
            user = (User) session.get("user");

            user.getImages().add(new Image(photoFileName, baos.toByteArray()));

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        etx.begin();
        em.merge(user);
        etx.commit();

        em.close();
        emf.close();
        session.put("user", user);
        return "SUCCESS";
    }
     ...
4

0 に答える 0