我正在使用 Spring Framework 事务注释进行事务管理,并且我有一个 abstract class 注释 @Transactional,如下所示:
package org.tts.maqraa.service;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Parts of this code have been copied from JARVANA site.
*
* @author Younis alomoush
*
*/
@Transactional(propagation=Propagation.REQUIRED)
public abstract class AbstractMaqraaService implements MaqraaService {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private int defaultMaxResults = DEFAULT_MAX_RESULTS;
@PersistenceContext(type=PersistenceContextType.TRANSACTION)
private EntityManager em;
/**
* The {@link EntityManager} which is used by all query manipulation and
* execution in this DAO.
*
* @return the {@link EntityManager}
*/
public EntityManager getEntityManager(){
return em;
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#getTypes()
*/
public abstract Set<Class<?>> getTypes();
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#store(java.lang.Object)
*/
@Transactional(propagation = Propagation.REQUIRED)
public <T extends Object> T store(T toStore) {
return getEntityManager().merge(toStore);
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#remove(java.lang.Object)
*/
@Transactional(propagation = Propagation.REQUIRED)
public void remove(Object toRemove) {
toRemove = getEntityManager().merge(toRemove);
getEntityManager().remove(toRemove);
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#flush()
*/
@Transactional(propagation = Propagation.REQUIRED)
public void flush() {
getEntityManager().flush();
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#refresh(java.lang.Object)
*/
@Transactional(propagation = Propagation.SUPPORTS)
public void refresh(Object o) {
try {
if (o != null) {
if (o instanceof java.util.Collection) {
for (Iterator<?> i = ((Collection<?>) o).iterator(); i
.hasNext();) {
try {
refresh(i.next());
} catch (EntityNotFoundException x) {
// This entity has been deleted - remove it from the
// collection
i.remove();
}
}
} else {
if (getTypes().contains(o.getClass())) {
getEntityManager().refresh(o);
}
}
}
} catch (EntityNotFoundException x) {
// This entity has been deleted
}
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#setDefaultMaxResults(int)
*/
@Transactional(propagation = Propagation.SUPPORTS)
public void setDefaultMaxResults(int defaultMaxResults) {
this.defaultMaxResults = defaultMaxResults;
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#getDefaultMaxResults()
*/
public int getDefaultMaxResults() {
return defaultMaxResults;
}
/*
* (non-Javadoc)
*
* @see
* org.skyway.spring.util.dao.JpaDao#executeQueryByNameSingleResult(java
* .lang.String)
*/
@SuppressWarnings("unchecked")
public <T extends Object> T executeQueryByNameSingleResult(String queryName) {
return (T) executeQueryByNameSingleResult(queryName, (Object[]) null);
}
/*
* (non-Javadoc)
*
* @see
* org.skyway.spring.util.dao.JpaDao#executeQueryByNameSingleResult(java
* .lang.String, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
public <T extends Object> T executeQueryByNameSingleResult(
String queryName, Object... parameters) {
Query query = createNamedQuery(queryName, DEFAULT_FIRST_RESULT_INDEX,
1, parameters);
return (T) query.getSingleResult();
}
/*
* (non-Javadoc)
*
* @see
* org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String)
*/
public <T extends Object> List<T> executeQueryByName(String queryName) {
return executeQueryByName(queryName, DEFAULT_FIRST_RESULT_INDEX,
getDefaultMaxResults());
}
/*
* (non-Javadoc)
*
* @see
* org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String,
* java.lang.Integer, java.lang.Integer)
*/
public <T extends Object> List<T> executeQueryByName(String queryName,
Integer firstResult, Integer maxResults) {
return executeQueryByName(queryName, firstResult, maxResults,
(Object[]) null);
}
/*
* (non-Javadoc)
*
* @see
* org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String,
* java.lang.Object[])
*/
public <T extends Object> List<T> executeQueryByName(String queryName,
Object... parameters) {
return executeQueryByName(queryName, DEFAULT_FIRST_RESULT_INDEX,
getDefaultMaxResults(), parameters);
}
/*
* (non-Javadoc)
*
* @see
* org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String,
* java.lang.Integer, java.lang.Integer, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
public <T extends Object> List<T> executeQueryByName(String queryName,
Integer firstResult, Integer maxResults, Object... parameters) {
Query query = createNamedQuery(queryName, firstResult, maxResults,
parameters);
return query.getResultList();
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#createNamedQuery(java.lang.String,
* java.lang.Integer, java.lang.Integer)
*/
public Query createNamedQuery(String queryName, Integer firstResult,
Integer maxResults) {
return createNamedQuery(queryName, firstResult, maxResults,
(Object[]) null);
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#createNamedQuery(java.lang.String,
* java.lang.Integer, java.lang.Integer, java.lang.Object[])
*/
public Query createNamedQuery(String queryName, Integer firstResult,
Integer maxResults, Object... parameters) {
Query query = getEntityManager().createNamedQuery(queryName);
if (parameters != null) {
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i + 1, parameters[i]);
}
}
query.setFirstResult(firstResult == null || firstResult < 0 ? DEFAULT_FIRST_RESULT_INDEX
: firstResult);
if (maxResults != null && maxResults > 0)
query.setMaxResults(maxResults);
return query;
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#executeQuery(java.lang.String,
* java.lang.Integer, java.lang.Integer, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
public <T extends Object> List<T> executeQuery(String queryString,
Integer firstResult, Integer maxResults, Object... parameters) {
Query query = createQuery(queryString, firstResult, maxResults,
parameters);
return query.getResultList();
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#executeQuery(java.lang.String,
* java.lang.Object[])
*/
@SuppressWarnings("unchecked")
public <T extends Object> List<T> executeQuery(String queryString,
Object... parameters) {
Query query = createQuery(queryString, DEFAULT_FIRST_RESULT_INDEX,
getDefaultMaxResults(), parameters);
return query.getResultList();
}
/*
* (non-Javadoc)
*
* @see
* org.skyway.spring.util.dao.JpaDao#executeQuerySingleResult(java.lang.
* String)
*/
@SuppressWarnings("unchecked")
public <T extends Object> T executeQuerySingleResult(String queryString) {
return (T) executeQuerySingleResult(queryString, (Object[]) null);
}
/*
* (non-Javadoc)
*
* @see
* org.skyway.spring.util.dao.JpaDao#executeQuerySingleResult(java.lang.
* String, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
public <T extends Object> T executeQuerySingleResult(String queryString,
Object... parameters) {
Query query = createQuery(queryString, DEFAULT_FIRST_RESULT_INDEX, 1,
parameters);
return (T) query.getSingleResult();
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#createQuery(java.lang.String,
* java.lang.Integer, java.lang.Integer)
*/
public Query createQuery(String queryString, Integer firstResult,
Integer maxResults) {
return createQuery(queryString, firstResult, maxResults,
(Object[]) null);
}
/*
* (non-Javadoc)
*
* @see org.skyway.spring.util.dao.JpaDao#createQuery(java.lang.String,
* java.lang.Integer, java.lang.Integer, java.lang.Object[])
*/
public Query createQuery(String queryString, Integer firstResult,
Integer maxResults, Object... parameters) {
Query query = getEntityManager().createQuery(queryString);
if (parameters != null) {
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i + 1, parameters[i]);
}
}
query.setFirstResult(firstResult == null || firstResult < 0 ? DEFAULT_FIRST_RESULT_INDEX
: firstResult);
if (maxResults != null && maxResults > 0)
query.setMaxResults(maxResults);
return query;
}
public final void log(LogLevel logLevel, String message,
Object... messageParam) {
switch (logLevel) {
case TRACE:
if (logger.isTraceEnabled()) {
logger.trace(message, messageParam);
}
break;
case DEBUG:
if (logger.isDebugEnabled()) {
logger.debug(message, messageParam);
}
break;
case INFO:
if (logger.isInfoEnabled()) {
logger.info(message, messageParam);
}
break;
case WARN:
if (logger.isWarnEnabled()) {
logger.warn(message, messageParam);
}
break;
case ERROR:
if (logger.isErrorEnabled()) {
logger.error(message, messageParam);
}
break;
default:
throw new IllegalArgumentException("Log Level is not defined: "
+ logLevel);
}
}
public final void log(LogLevel logLevel, String message, Throwable throwable) {
switch (logLevel) {
case TRACE:
if (logger.isTraceEnabled()) {
logger.trace(message, throwable);
}
break;
case DEBUG:
if (logger.isDebugEnabled()) {
logger.debug(message, throwable);
}
break;
case INFO:
if (logger.isInfoEnabled()) {
logger.info(message, throwable);
}
break;
case WARN:
if (logger.isWarnEnabled()) {
logger.warn(message, throwable);
}
break;
case ERROR:
if (logger.isErrorEnabled()) {
logger.error(message, throwable);
}
break;
default:
throw new IllegalArgumentException("Log Level is not defined: "
+ logLevel);
}
}
public enum LogLevel{
TRACE, DEBUG, INFO, WARN, ERROR;
}
}
另外,我还有一个具体的类
package org.tts.maqraa.service;
import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.tts.maqraa.data.Student;
public class StudentsService extends AbstractMaqraaService {
@Override
public Set<Class<?>> getTypes() {
Set<Class<?>> set = new HashSet<Class<?>>();
set.add(Student.class);
return set;
}
public Student registerStudent(Student student) {
Annotation [] annotation = StudentsService.class.getAnnotations();
System.out.println(annotation);
return this.store(student);
}
public Student editStudent(Student student){
return this.store(student);
}
public void deregisterStudent(Student student){
this.remove(student);
}
public List<Student> findAllStudents(){
return this.executeQueryByName("Student.findAll");
}
}
如果你注意到方法 register student 已经提供了代码来检查我真正找到 @Transactional 注释的注释。
这是一个矛盾,我有另一个链接谈到注释的继承,它说根本没有继承。
查看此链接:http://fusionsoft-online.com/articles-java-annotations.php
谁能帮我解决这个矛盾?
最佳答案
是的,如果注释有 @Inherited 是可能的添加到它。例如,@Transactional注释有 @Inherited.
来自文档:
Indicates that an annotation type is automatically inherited. If an Inherited meta-annotation is present on an annotation type declaration, and the user queries the annotation type on a class declaration, and the class declaration has no annotation for this type, then the class's superclass will automatically be queried for the annotation type. This process will be repeated until an annotation for this type is found, or the top of the class hierarchy (Object) is reached. If no superclass has an annotation for this type, then the query will indicate that the class in question has no such annotation.
Note that this meta-annotation type has no effect if the annotated type is used to annotate anything other than a class. Note also that this meta-annotation only causes annotations to be inherited from superclasses; annotations on implemented interfaces have no effect.
@Transactional的文档:
@Target(value={METHOD,TYPE}) @Retention(value=RUNTIME) @Inherited @Documented public @interface Transactional
题外话:尽管在 Java 中,您不能子类型化注解。
关于java - 类是否可以继承父类(super class)的注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596744/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/