如果我的Dao层抛出Dao特定异常,那么在我的服务层处理它们是否会引起关注?如果是,那么我应该使异常通用且独立于任何层来解决它,还是有其他方法?
同样的问题适用于服务层抛出的UI层处理异常.
我正在尝试使用Android Room,在完成本教程之后,当我尝试构建应用程序时,我收到以下错误:
Error:(23, 27) error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: screen_items)
这个名字很好,应该存在.在进行更改后,我清理了项目并确保从设备中完全卸载了该项目.
在我用这条线Activity初始化东西onCreate:
db = AppDatabase.getDatabase(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
AppDatabase
@Database(entities = {PermitItem.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public static String DATABASE_NAME = "my_database";
public final static String TABLE_ITEMS = "screen_items";
private static AppDatabase INSTANCE;
public abstract PermitItemDao permitItemModel();
public static AppDatabase getDatabase(Context context) { …Run Code Online (Sandbox Code Playgroud) 数据访问对象和活动记录之间有什么区别?它们似乎完全相同,因为它们在应用程序和持久层之间构建了一个层,并使用SQL查询抽象出直接数据库访问.
我一直在关注使用它进行单元测试DAO类的EasyMock和教程/示例,用于"外部容器"测试.但是,我认为他们中的大多数都在谈论测试服务层,而不是模拟DAO类.我有点困惑,你真的是如何对DAO层进行单元测试吗?
有人会说,与DB和EJB交互的测试实际上是集成测试而不是单元测试,但是你怎么知道你的SQL是否正确(假设没有ORM)并且你的DAO插入/查询真实的正确数据(读取,本地数据库与生产中的数据库类似?
我读到DBUnit是这种情况的解决方案.但我的问题是使用像DBUnit这样的框架"外部容器".如果DAO依赖于某些EJB,我们如何处理事务,如果有更新其他表的触发器会发生什么?
仅对具有此类依赖性的DAO进行单元测试的最佳方法是什么?
我在下面写了这个方法,假设从数据库中删除一个成员记录.但是当我在我的servlet中使用它时,它会返回一个错误.
会员道教班
public static void deleteMember(Member member) {
Session hibernateSession = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = hibernateSession.beginTransaction();
hibernateSession.delete(member);
tx.commit();
}
Run Code Online (Sandbox Code Playgroud)
控制器部分
if(delete != null) {
HttpSession httpSession = request.getSession();
Member member = (Member) httpSession.getAttribute("member");
MemberDao.deleteMember(member);
nextPage = "ledenlijst.jsp";
}
Run Code Online (Sandbox Code Playgroud)
HTTP状态500
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
Run Code Online (Sandbox Code Playgroud)
有时,当我尝试多次执行页面时,它甚至会抛出此错误.
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
Run Code Online (Sandbox Code Playgroud)
有人知道究竟是什么导致了这些错误吗?
在我的应用程序中,它使用Spring和Hibernate,我解析一个CSV文件,并在handleRow()每次从CSV文件中读取记录时通过调用填充数据库.
我的域名模型:
'家庭'有很多'SubFamily'
'SubFamily'有很多'Locus'
'Locus'属于'Species'
Family <-> SubFamily <-> Locus 都是双向映射.
码:
public void handleRow(Family dummyFamily, SubFamily dummySubFamily, Locus dummyLocus) {
//Service method which access DAO layers
CommonService serv = ctx.getCommonService();
boolean newFamily=false;
Family family=serv.getFamilyByFamilyId(dummyFamily.getFamilyId());
if(family==null){
newFamily=true;
family=new Family();
family.setFamilyId(dummyFamily.getFamilyId());
family.setFamilyIPRId(dummyFamily.getFamilyIPRId());
family.setFamilyName(dummyFamily.getFamilyName());
family.setFamilyPattern(dummyFamily.getFamilyPattern());
family.setRifID(dummyFamily.getRifID());
}
SubFamily subFamily = family.getSubFamilyBySubFamilyId( dummySubFamily.getSubFamilyId() );
if(subFamily==null){
subFamily=new SubFamily();
subFamily.setRifID(dummySubFamily.getRifID());
subFamily.setSubFamilyId(dummySubFamily.getSubFamilyId());
subFamily.setSubFamilyIPRId(dummySubFamily.getSubFamilyIPRId());
subFamily.setSubFamilyName(dummySubFamily.getSubFamilyName());
subFamily.setSubFamilyPattern(dummySubFamily.getSubFamilyPattern());
family.addSubFamily(subFamily);
}
//use the save reference, to update from GFF handler
Locus locus = dummyLocus;
subFamily.addLocus(locus);
assignSpecies(serv,locus);
//Persist object …Run Code Online (Sandbox Code Playgroud) 这不是一个关于哪个更好的问题,而是一个关于它们在功能上有何不同的问题.我遇到的问题已经解决了,但我很好奇为什么会发生这种情况.
背景 - 使用Excel vba从Access数据库中提取数据.当用户单击按钮时,会从Access中提取记录集,并将各种数据填充到电子表格中.然后,从另一个查询中提取另一个记录集以填充电子表格的另一部分.
ADO做了什么 - ADO非常适合我的第一个记录集.但是,我的第二个记录集转到Access中的查询,运行,并且不返回任何行.如果我在Access中运行此查询,它会打开(大约3到4秒后).此查询具有多个连接,计算项,限制以及可能的Union查询(我尝试了许多不同的方式,有/无联合等).我尝试关闭并重新打开ado连接.我尝试更改超时值,我甚至测试使用ADO命令运行对此数据的Make表查询,然后从表中取出(这样做顺便说一句,但不是最好的情况,因为数据不断变化,每次有人使用此工具时,我都不想运行make table查询.
所以,我把第二个数据拉到了DAO,看,它有效.第一个数据拉取仍然是ADO(我通常更喜欢使用),但现在考虑将其更改为DAO,因为我宁愿在代码中使用一种数据访问方法.
那么,有人可以向我解释为什么ADO不会在一个案例中提取数据,但DAO会吗?同样,这纯粹是出于提供信息的目的.
保持简短和甜美:
有hibernate-commons-annotations 4.1.0-Final和hibernate-annotations 3.5.6-Final.
我是个小伙子,他们之间有什么区别,我需要他们两个吗?
试图"避免"JPA,我的意思是使用嵌入在Hibernate中的JPA 2.0标准.
谢谢!
官方文件指出:
It is recommended to have multiple Dao classes in your codebase depending on the tables they touch.
Run Code Online (Sandbox Code Playgroud)
并且可以使用Transaction注释标记方法,如下所示:
@Dao
public abstract class ProductDao {
@Insert
public abstract void insert(Product product);
@Delete
public abstract void delete(Product product);
@Transaction
public void insertAndDeleteInTransaction(Product newProduct, Product oldProduct) {
// Anything inside this method runs in a single transaction.
insert(newProduct);
delete(oldProduct);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果一个事务跨越多个DAO怎么办?我应该将所有DAO合并为一个只是为了支持交易,还是有更好的方法来做到这一点?
有没有办法在不编辑实体对象的情况下在单个方法上更改JPA fetch类型?
我有一个由JPA实体类组成的共享ORM层.该ORM层由两个DAO层访问.一个DAO需要延迟抓取,因为它适用于我的Web应用程序,另一个需要急切的抓取,因为我需要它是线程安全的.
这是我的线程安全DAO的示例方法,
@PersistenceContext(unitName = "PersistenceUnit", type = PersistenceContextType.TRANSACTION)
private EntityManager em;
public ErrorCode findErrorCodeById(short id) {
return (ErrorCode) em.createNamedQuery("ErrorCode.findById").
setParameter("id", id).getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)
我如何使这个方法(或整个类)使用渴望获取?
dao ×10
java ×4
hibernate ×3
android ×2
android-room ×2
persistence ×2
sqlite ×2
activerecord ×1
ado ×1
dbunit ×1
easymock ×1
excel ×1
jpa ×1
methods ×1
ms-access ×1
orm ×1
service ×1
spring ×1
unit-testing ×1
vba ×1