如果我使用像JPA2这样的ORM - 我的实体映射到我的数据库,我还应该使用DAO吗?这似乎是一个更多的开销.
例如,我需要维护三个额外的包:
一个指定我的域对象(几乎映射我的Entity对象):
public class Employee {
private String firstName;
private String lastName;
...
// Getters and setters
}
Run Code Online (Sandbox Code Playgroud)一个包含指定我的DAO方法的接口
public interface EmployeeDAO {
public void addEmployee(Employee employee);
public Employee getEmployeeById(long id);
...
}
Run Code Online (Sandbox Code Playgroud)一个包含实现我的DAO的会话bean
public EmployeeJpaDAO implements EmployeeDAO {
interface method implementations here
....
private method that transform my Employee entity into my Employee domain object
}
Run Code Online (Sandbox Code Playgroud)现在,每次我需要执行新的CRUD操作时,需要添加许多额外的行李.
但是,从DAO中看到的好处是:
您可以使用DAO的内存实现来对服务层进行单元测试.这意味着您不需要访问数据库来测试业务逻辑,并且可以确保您的对象始终包含属性的相同值
它将业务逻辑与数据库访问逻辑分开
不涉及实现DAO的选项是在服务层中使用实体对象和EntityManager:
@Stateless
public class EmployeeEjb {
@PersistenceContext(unitName = "employee")
private EntityManager manager;
public Employee getEmployeeById(long id) …Run Code Online (Sandbox Code Playgroud) 我使用的是JDK 1.7,Apache Tomcat 7.0.23,我在WEB_INF lib文件夹中放置了JSTL核心库(1.2)和STANDARD jar,它没有给我任何警告,但是当我尝试运行代码时
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- Create Bean Instance-->
<jsp:useBean id="listdomain" class="bean.PopulateMultiDomain" scope="session"></jsp:useBean>
<jsp:setProperty property="*" name="listdomain"/>
<c:forEach var="item" items="${listdomain.status}">
<option>
<c:out value="${item}" />
</option>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:56)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:410)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:117)
org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:311)
org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:152)
org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:410)
org.apache.jasper.compiler.Parser.parseDirective(Parser.java:475)
org.apache.jasper.compiler.Parser.parseElements(Parser.java:1425)
org.apache.jasper.compiler.Parser.parse(Parser.java:138)
org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:198)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
Run Code Online (Sandbox Code Playgroud)
有谁能告诉我我犯的是什么错误?
我想知道是否有可能在eclipse中配置run as maven install以跳过单元测试,如果这样的事情是可行的,那么请告诉我如何做到这一点,提前谢谢.
我正在尝试手动连接Spring Data JPA对象,以便我可以生成DAO代理(也称为存储库) - 而无需使用Spring bean容器.
不可避免地,我会被问到为什么要这样做:这是因为我们的项目已经在使用Google Guice(并且在使用Gin和GWT的UI上),我们不想维护另一个IoC容器配置,或者拉入所有产生的依赖关系.我知道我们可以使用Guice SpringIntegration,但这是最后的选择.
似乎所有东西都可用于手动连接对象,但由于它没有很好地记录,我现在遇到了困难.
根据Spring Data用户指南,可以单独使用存储库工厂.不幸的是,该示例显示了RepositoryFactorySupport哪个是抽象类.经过一番搜索,我找到了JpaRepositoryFactory
JpaRepositoryFactory实际上工作得很好,除了它不会自动创建交易.必须手动管理事务,否则任何内容都不会持久保存到数据库:
entityManager.getTransaction().begin();
repositoryInstance.save(someJpaObject);
entityManager.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)
问题原来是@Transactional注释没有自动使用,需要一个帮助TransactionInterceptor
值得庆幸的是,JpaRepositoryFactory在返回之前,可以进行回调以向生成的Repository代理添加更多AOP建议:
final JpaTransactionManager xactManager = new JpaTransactionManager(emf);
final JpaRepositoryFactory factory = new JpaRepositoryFactory(emf.createEntityManager());
factory.addRepositoryProxyPostProcessor(new RepositoryProxyPostProcessor() {
@Override
public void postProcess(ProxyFactory factory) {
factory.addAdvice(new TransactionInterceptor(xactManager, new AnnotationTransactionAttributeSource()));
}
});
Run Code Online (Sandbox Code Playgroud)
这是事情进展不顺利的地方.单步执行代码中的调试器,TransactionInterceptor确实创建了一个事务 - 但错误EntityManager.Spring EntityManager通过查看当前正在执行的线程来管理活动.这样TransactionInterceptor做并看到EntityManager线程没有活动绑定,并决定创建一个新线程.
但是,这个new EntityManager与创建并传递给JpaRepositoryFactory构造函数的实例不同,后者需要一个EntityManager.问题是,我如何制作TransactionInterceptor …
我有以下两个实体:
1-播放列表:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "playlist", orphanRemoval = true, cascade = CascadeType.ALL)
@OrderBy("adOrder")
private Set<PlaylistadMap> PlaylistadMaps = new HashSet<PlaylistadMap>(0);
Run Code Online (Sandbox Code Playgroud)
2- PlaylistadMap:
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "fk_playlist", referencedColumnName = "pkid", nullable = false)
private Playlist playlist;
Run Code Online (Sandbox Code Playgroud)
使用getCurrentSession().delete();我删除播放列表时,我收到以下异常:
org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.xeno.advertisingsuite.web.domain.PlaylistadMap#6]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): …Run Code Online (Sandbox Code Playgroud) 尝试部署我的应用程序时,我似乎遇到以下异常:
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
java.util.List is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at java.util.List
at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return
at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse
java.util.List does not have a no-arg default constructor.
this problem is related to the following location:
at java.util.List
at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return
at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse
Run Code Online (Sandbox Code Playgroud)
我的代码工作得很好,直到我将返回类型从List更改为List <List <RelationCanonical >>
这是部分Web服务:
@Name("relationService")
@Stateless
@WebService(name = "RelationService", serviceName = "RelationService")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public …Run Code Online (Sandbox Code Playgroud) 另一个Hibernate问题......:P
使用Hibernate的Annotations框架,我有一个User实体.每个人都User可以拥有一群朋友:其他人User的集合.但是,我还没有弄清楚如何在User由Users 列表组成的类中创建多对多关联(使用用户朋友中间表).
这是User类及其注释:
@Entity
@Table(name="tbl_users")
public class User {
@Id
@GeneratedValue
@Column(name="uid")
private Integer uid;
...
@ManyToMany(
cascade={CascadeType.PERSIST, CascadeType.MERGE},
targetEntity=org.beans.User.class
)
@JoinTable(
name="tbl_friends",
joinColumns=@JoinColumn(name="personId"),
inverseJoinColumns=@JoinColumn(name="friendId")
)
private List<User> friends;
}
Run Code Online (Sandbox Code Playgroud)
用户朋友的映射表只有两列,这两者都是外键到uid该列tbl_users表.这两列是personId(应该映射到当前用户)和friendId(指定当前用户的朋友的id).
问题是,即使我已经预先填充了朋友表,使得系统中的所有用户都是所有其他用户的朋友,"朋友"字段仍会显示为空.我甚至尝试过切换关系@OneToMany,但它仍然是null(尽管Hibernate调试输出显示了一个SELECT * FROM tbl_friends WHERE personId = ? AND friendId = ?查询,但没有别的).
有关如何填充此列表的任何想法?谢谢!
java entity-relationship hibernate java-ee hibernate-annotations
嗨伙计们试图在我的本地主机上的apache tomcat上使用eclipse/linux运行我的应用程序时,应用程序运行良好但是,我收到了以下警告
__PRE__
任何想法这个警告意味着什么,如何解决它?
我最近阅读了来自Neil Griffin的这篇文章,在不同种类的JSF Managed-Beans之间做出区分,这让我想到了我自己的应用程序中不同bean之间的区别.要快速总结一下要点:
Model Managed-Bean:这种类型的托管bean参与MVC设计模式的"模型"关注.当你看到"模型"这个词时 - 想想数据.JSF模型bean应该是遵循JavaBean设计模式的POJO,其中getter/setter封装属性.
支持托管Bean:这种类型的托管bean参与MVC设计模式的"视图"关注.backing-bean的目的是支持UI逻辑,并且与Facef组合中的JSF视图或JSF表单具有1 :: 1的关系.虽然它通常具有带有关联getter/setter的JavaBean样式属性,但它们是View的属性 - 而不是底层应用程序数据模型的属性.JSF支持bean也可能有JSF actionListener和valueChangeListener方法.
Controller Managed-Bean:这种类型的托管bean参与MVC设计模式的"Controller"关注.控制器bean的目的是执行某种业务逻辑并将导航结果返回给JSF导航处理程序.JSF控制器bean通常具有JSF操作方法(而不是actionListener方法).
支持Managed-Bean:这种类型的bean"支持"MVC设计模式的"View"关注中的一个或多个视图.典型的用例是向JSF h:selectOneMenu下拉列表提供ArrayList,这些列表出现在多个JSF视图中.如果下拉列表中的数据特定于用户,则bean将保留在会话范围内.
Utility Managed-Bean:这种类型的bean为一个或多个JSF视图提供某种类型的"实用程序"功能.一个很好的例子可能是FileUpload bean,它可以在多个Web应用程序中重用.
这对我来说很有意义,在过去的几个小时里,我一直在重构我的代码,并针对用户登录提出以下内容:
这AuthenticationController是Controller Managed-Bean的一个例子.它是请求范围的,具有两个用于设置用户名和密码的getter和setter,以及两种导航方法,authenticate并logout在成功登录时将用户导航到其私有区域,或者在注销时返回主页面.
这UserBean是一个支持管理Bean的示例.它是会话范围的,并且具有User类的实例(当您未经过身份验证时将使用getter和setter,它将为null),仅此而已.
该AuthenticationController有这个用户作为托管属性(@ManagedProperty(value = "#{userController.user} private User user;).验证成功后,AuthenticationController将使用用于登录的相应用户名将托管属性设置为实际用户实例.
任何新的bean都可以将用户作为托管属性获取并提取他们需要的数据,例如组成员资格,如果User该类具有包含组名的列表.
这种方式是关于分离问题的正确方法吗?