我不是ejb专家。我有一个像下面这样的服务类。我正在我的服务类中的某个位置保存一个文件,并在dao中调用一个方法来保存文件哈希码。由于某些原因,我有一段时间在我的dao层中出现异常。最近我发现,当我得到解释时,不会删除从我的服务层保存的文件。
@Stateless
@Local
@TransactionManagement
public class ImportUpgradeServiceImpl implements ImportUpgradeService {
@Inject
private UpgradePackageDao upgradePackageDao;
@Override
public boolean savePackage() {
//For the sake of simplicity I simplified the code here
File file = new File("d:\\ejbtest.log");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
upgradePackageDao.savePackageHash(null);
return false;
}
}
下面是我的DAO
public class UpgradePackageDaoImpl implements UpgradePackageDao {
@Override
public void savePackageHash(String hash) {
throw new RuntimeException("cannot save");
}
}
然后我用@TransactionManagement注释了我的服务类。我错过了什么?或者我误解了ejb交易管理? ejb transaction mamangement是否仅为数据库事务设计?
答案 0 :(得分:4)
不建议在EJB中与文件系统进行交互。以下是解释它的EJB Restrictions的摘录。
为什么EJB不能在文件系统中读写文件和目录? 为什么他们不能访问文件描述符?
不允许企业bean访问文件主要是因为 文件不是事务资源。允许EJB访问文件 或文件系统中的目录,或使用文件描述符 妥协组件可分发性,并且存在安全隐患。
由于文件不是事务性资源,因此回滚对它没有影响。