如何在Hibernate和struts 2的pojo类setter方法[会话文件上传应用程序]中调用另一个方法



嗨,朋友们,我正在开发一个使用hibernate和struts2的web应用程序。我正在创建相册,我使用hibernate成功地完成了这项工作,但使用hibernate,它在插入数据库时遇到了问题。该模块的工作原理是这样的,一旦上传文件,它就会插入FileName、Contenttype、id,并假设插入Image file(byte[])Content,但它在表值中显示Null。。我的代码是这样的。。。

@Entity
@Table(name="PHOTOALBUM")
public class User implements Serializable  {
@Id
@GeneratedValue
@Column(name="PHOTO_ID")
    private Long id;
@Column(name="IMAGE")
private byte[] Image;

@Column(name="CONTENT_TYPE")
    private String userImageContentType;
@Column(name="PHOTO_NAME")
    private String userImageFileName;
            public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
            public String getUserImageFileName() {
        return userImageFileName;
    }
    public void setUserImageFileName(String userImageFileName) {
        this.userImageFileName = userImageFileName;
    }
            public String getUserImageContentType() {
        return userImageContentType;
    }
    public void setUserImageContentType(String userImageContentType) {
        this.userImageContentType = userImageContentType;
    }
public byte[] getImage() {
        return Image;
    }
    public void setImage(byte[] Image) {
        Image=Change(this.getUserImage());
        this.Image = Image;
    }
    @Transient
    private File userImage;
    public File getUserImage() {
        return userImage;
    }
    public void setUserImage(File userImage) {
        this.userImage = userImage;
    }
    public byte[] Change(File userImage)
    {
       // userImage=this.getUserImage();
       // String name=userImage.getName();
       // long len=userImage.length();
        byte[] bFile = new byte[(int) userImage.length()];
        try {
        FileInputStream fileInputStream = new FileInputStream(userImage);
    fileInputStream.read(bFile);
    fileInputStream.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
       // System.out.println("The Name Of File In Pojo Class Is:="+ name);
        //System.out.println("The Length Of File In Pojo Class Is:="+ len);
        //System.out.println("The Content Of File In Pojo Class Is:="+ bFile);
        return bFile;
    }
}

我正在保存像这个这样的值

 public class UserDAOImpl implements UserDAO {
@SessionTarget
Session session;
@TransactionTarget
Transaction transaction;
/**
 * Used to save or update a user.
 */
@Override
public void saveOrUpdateUser(User user) {
    try {
        session.saveOrUpdate(user);
    } catch (Exception e) {
        transaction.rollback();
        e.printStackTrace();
    }
}
/**
 * Used to delete a user.
 */
@Override
public void deleteUser(Long userId) {
    try {
        User user = (User) session.get(User.class, userId);
        session.delete(user);
    } catch (Exception e) {
        transaction.rollback();
        e.printStackTrace();
    } 
}
/**
 * Used to list all the users.
 */
@SuppressWarnings("unchecked")
@Override
public List<User> listUser() {
    List<User> courses = null;
    try {
        courses = session.createQuery("from User").list();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return courses;
}
/**
 * Used to list a single user by Id.
 */
@Override
public User listUserById(Long userId) {
    User user = null;
    try {
        user = (User) session.get(User.class, userId);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return user;
}
}

struts动作映射如下。。。

 <package name="default" extends="hibernate-default">
<action name="saveOrUpdateUser"method="saveOrUpdate"class="com.srikanth.web.UserAction">
        <result name="success" type="redirect">listUser</result>
    </action>
    <action name="listUser" method="list" class="com.srikanth.web.UserAction">
        <result name="success">/register.jsp</result>
    </action>
    <action name="editUser" method="edit" class="com.srikanth.web.UserAction">
        <result name="success">/register.jsp</result>
    </action>
    <action name="deleteUser" method="delete" class="com.srikanth.web.UserAction">
        <result name="success" type="redirect">listUser</result>
    </action>
</package>

我的jsp是这样的

 <s:form action="saveOrUpdateUser">
<s:push value="user">
    <s:hidden name="id" />
    <s:file name="userImage" label="User Image" />
            <s:submit />
</s:push>
 </s:form>
 <s:iterator value="userList" status="userStatus">
        <s:property value="id" />
            <s:property value="userImageFileName" />
            <s:property value="userImageContentType" />
            <img src='<s:property value="userImage" />' alt"" />
            <s:url id="deleteURL" action="deleteUser">
                <s:param name="id" value="%{id}"></s:param>
            </s:url> <s:a href="%{deleteURL}">Delete</s:a>
    </s:iterator>

我正在尝试调用Change Method,以便它将文件转换为byte[],并使用setter将其存储在byte[]Image变量中,但它不起作用。。。。所以请帮我做这个。。。。。提前感谢

根据我对问题的理解,问题只是将文件插入表中。复制&将Change()方法粘贴到com.srikanth.web.UserAction类中,因为您正在为每个DB事务使用此操作。在数据库中插入/更新之前,请使用Change()方法。

例如:

public class UserAction extends ActionSupport{
   //variable to get file from jsp
   private File uploadedImage;
    .....
   //setters & getters for uploadedImage

@Override
public String gsexecute() throws Exception {
   User user = new User();
   //set image value as byteArray
   user.setImage(Change(uploadedImage));
   //insert or update DB here
    return SUCCESS;
}
 public byte[] Change(File userImage)
   {
   // userImage=this.getUserImage();
   // String name=userImage.getName();
   // long len=userImage.length();
    byte[] bFile = new byte[(int) userImage.length()];
    try {
    FileInputStream fileInputStream = new FileInputStream(userImage);
fileInputStream.read(bFile);
fileInputStream.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
   // System.out.println("The Name Of File In Pojo Class Is:="+ name);
    //System.out.println("The Length Of File In Pojo Class Is:="+ len);
    //System.out.println("The Content Of File In Pojo Class Is:="+ bFile);
    return bFile;
   }
 }

并确保表列应该支持字节数组插入。例如:MYSQL使用BLOB列类型。

最新更新