我有一个图像上传/存储应用程序,其中我有一个具有多个相关图像的用户实体(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
字段Image
的值0
而不是正确的 id。GetImageAction
action 使用参数从图像中设置输入流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;
}
...
}
现在我猜这是因为Image
迭代的新对象具有默认的 long 值0
而不是生成的 Id(我能够访问其他字段的值,例如name
)。为什么是这样?由于图像在显示结果时已经持久化,不应该正确检索 Id 值吗?我在这里做错了什么?
请帮忙。我觉得我可能在这里遗漏了一些简单的东西,但它就是无法解决。
编辑:
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";
}
...