0

我有一个图像上传/存储应用程序,其中我有一个具有多个相关图像的用户实体(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。GetImageActionaction 使用参数从图像中设置输入流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";
    }
     ...
4

0 回答 0