複数の関連画像を持つ User エンティティを持つ画像アップロード/ストア アプリケーションがあります ( List<Image> images
OneToMany 関係を使用)。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 を使用して画像から入力ストリームを設定します0
GetImageAction
imageId
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 値を正しく取得する必要はありませんか? ここで何が間違っていますか?0
name
助けてください。ここで単純なものが欠けているかもしれませんが、それは解決されません。
編集:
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";
}
...