在Hibernate中是否可以使用实际值而不是问号来打印生成的SQL查询?
如果使用Hibernate API无法打印具有实际值的查询,您会建议如何?
Hibernate 3.x使用slf4j进行日志记录.Hibernate 4.x使用jboss-logging.我正在编写一个独立的应用程序,它使用Hibernate 4和SLF4J进行日志记录.
如何配置Hibernate以登录SLF4J?
如果那不可能,我怎么能配置Hibernate的日志记录呢?
关于日志记录的Hibernate 4.1手册部分首先警告它是......
完全过时了.Hibernate从4.0开始使用JBoss Logging.当我们将此内容迁移到开发人员指南时,这将记录在案.
......继续谈论SLF4J,所以没用.入门指南和开发人员指南都没有谈论记录.迁移指南也没有.
我已经查找了有关jboss-logging本身的文档,但我根本找不到任何文档.在GitHub的页面是沉默的,和JBoss的社区项目页面甚至没有列出的jboss-记录.我想知道项目的bug跟踪器是否可能有任何与提供文档相关的问题,但事实并非如此.
好消息是,在应用程序服务器(如JBoss AS7)中使用Hibernate 4时,很大程度上会记录日志记录.但是我如何在独立应用程序中配置它?
我使用JPA进行数据库访问,并使用正确的名称注释每一列.现在如果我执行查询(例如findAll())它返回
Unknown column 'program0_.program_id' in 'field list'
Run Code Online (Sandbox Code Playgroud)
错误消息是正确的program_id是未知的,因为真实姓名是programId.
型号:程序
@Entity
@Table(name = "programs")
@XmlRootElement
public class Program implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "programId")
private Long programId;
@ManyToMany
@JoinTable(
name = "programlabels",
joinColumns = {
@JoinColumn(name = "program", referencedColumnName = "programId")},
inverseJoinColumns = {
@JoinColumn(name = "label", referencedColumnName = "labelId")})
private Collection<Label> labels;
}
Run Code Online (Sandbox Code Playgroud)
标签
@Entity
@Table(name = "labels")
@XmlRootElement
public class Label implements Serializable {
@Id
@Basic(optional …Run Code Online (Sandbox Code Playgroud) 我有crearte log4j.properties文件,如下所示:
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.hql.ast.AST=info
log4j.logger.org.hibernate.tool.hbm2ddl=warn
log4j.logger.org.hibernate.hql=debug
log4j.logger.org.hibernate.cache=info
log4j.logger.org.hibernate.jdbc=debug
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
log4j.appender.hb.layout.ConversionPattern=HibernateLog --> %d{HH:mm:ss} %-5p %c - %m%n
log4j.appender.hb.Threshold=TRACE
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我如何将其包含在hibernate.cfg.xml文件中吗?对不起,我实际上不知道log4j是如何工作的.我创建它来显示我的hibernate查询value而不是?但它仍然没有显示?任何变化所以我需要进一步继续吗?
我从这里参考Hibernate显示真正的SQL
如何在查询中查看实际值而不是问号?现在,我看到了
Hibernate: inser into TABEL (ID, FORMAT, SIZE) values (?,?,?)
Run Code Online (Sandbox Code Playgroud)
我想看到使用的真实值而不是问号.
我在我的hibernate配置文件中设置了它并打开了调试标志.
<property name="show_sql"> true </property>
Run Code Online (Sandbox Code Playgroud)
先感谢您.
我有一个休息应用程序,其中一个资源可以更新.以下是负责实现此任务的两种方法:
updateWithRelatedEntities(String,Store):接收通过反序列化PUT请求实体构造的id和新对象Store,在新对象上设置版本(用于乐观锁定)并在事务中调用update.
public Store updateWithRelatedEntities(String id, Store newStore) {
Store existingStore = this.get(id);
newStore.setVersion(existingStore.getVersion());
em.getTransaction().begin();
newStore = super.update(id, newStore);
em.getTransaction().commit();
return newStore;
}
Run Code Online (Sandbox Code Playgroud)update(String,T):进行更新的通用方法.检查id是否匹配并执行合并操作.
public T update(String id, T newObj) {
if (newObj == null) {
throw new EmptyPayloadException(type.getSimpleName());
}
Type superclass = getClass().getGenericSuperclass();
if (superclass instanceof Class) {
superclass = ((Class) superclass).getGenericSuperclass();
}
Class<T> type = (Class<T>) (((ParameterizedType) superclass).getActualTypeArguments()[0]);
T obj = em.find(type, id);
if (!newObj.getId().equals(obj.getId())) {
throw new IdMismatchException(id, newObj.getId());
}
return em.merge(newObj);
}
Run Code Online (Sandbox Code Playgroud)问题是这个调用:T …
我想要实现的是,通过以这种简单的方式使用多线程,在我的 RESTApi 控制器中使用 @Async 和 CompletableFuture 可以获得更好的性能吗?
这是我所做的,这是我的控制器:
@PostMapping("/store")
@Async
public CompletableFuture<ResponseEntity<ResponseRequest<CategoryBpsjResponseDto>>> saveNewCategoryBPSJ(@Valid @RequestBody InputRequest<CategoryBPSJRequestDto> request) {
CompletableFuture<ResponseEntity<ResponseRequest<CategoryBpsjResponseDto>>> future = new CompletableFuture<>();
future.complete(ResponseEntity.ok(new ResponseRequest<>("Okay", categoryBPSJService.save(request))));
return future;
}
Run Code Online (Sandbox Code Playgroud)
VS
@PostMapping("/store")
public ResponseEntity<ResponseRequest<CategoryBpsjResponseDto>> saveNewCategoryBPSJ(@Valid @RequestBody InputRequest<CategoryBPSJRequestDto> request) {
return ResponseEntity.ok(new ResponseRequest<>("okay", categoryBPSJService.save(request));
}
Run Code Online (Sandbox Code Playgroud)
正如你在我的第一个控制器函数中看到的,我在我的函数响应中添加了 CompletableFuture,但是在我的服务中,我在这一行中保存的categoryBPSJService.save(request)不是异步的,只是一个看起来像这样的简单函数:
public CategoryBpsjResponseDto save(InputRequest<CategoryBPSJRequestDto> request) {
CategoryBPSJRequestDto categoryBPSJDto = request.getObject();
Boolean result = categoryBPSJRepository.existsCategoryBPSJBycategoryBPSJName(categoryBPSJDto.getCategoryBPSJName());
if(result){
throw new ResourceAlreadyExistException("Category BPSJ "+ categoryBPSJDto.getCategoryBPSJName() + " already exists!");
}
CategoryBPSJ categoryBPSJ = new CategoryBPSJ();
categoryBPSJ = map.DTOEntity(categoryBPSJDto);
categoryBPSJ.setId(0L); …Run Code Online (Sandbox Code Playgroud) 我想在hibernate Hql中的同一个查询中执行多个更新语句.如下:
hql = " update Table1 set prob1=null where id=:id1; "
+ " delete from Table2 where id =:id2 ";
...
query.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
在同一个executeUpdate调用中,我想更新Table1中的记录并从Table2中删除记录.
那可能吗?
当在tomcat中运行hibernate应用程序时,如何查看hibernate正在触发哪些查询?
有Foo一个@Version列的实体.如果我想删除它,我希望Spring Data JPA和/或Hibernate检查@Version列的当前值是否与数据库中的值匹配.如果没有,则应拒绝删除.这与预期的分离实体一起工作:
@Transactional
public void delete(Foo foo) {
fooRepository.delete(foo); // throws ObjectOptimisticLockingFailureException
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我首先从存储库加载实体,然后使用不同的版本在同一事务中删除它,则无论@Version列的值如何,删除都会通过:
@Transactional
public void delete(int fooId, long version) {
Foo foo = fooRepository.findOne(fooId);
foo.setVersion(version);
fooRepository.delete(foo); // passes regardless of value of version
}
Run Code Online (Sandbox Code Playgroud)
当我查看Hibernate调试输出时,执行版本比较(delete from foo where id=? and version=?)但不是我期望的效果.
我错过了什么?