我正试图在一个@HandleBeforeSave事件中得到旧实体.
@Component
@RepositoryEventHandler(Customer.class)
public class CustomerEventHandler {
private CustomerRepository customerRepository;
@Autowired
public CustomerEventHandler(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}
@HandleBeforeSave
public void handleBeforeSave(Customer customer) {
System.out.println("handleBeforeSave :: customer.id = " + customer.getId());
System.out.println("handleBeforeSave :: new customer.name = " + customer.getName());
Customer old = customerRepository.findOne(customer.getId());
System.out.println("handleBeforeSave :: new customer.name = " + customer.getName());
System.out.println("handleBeforeSave :: old customer.name = " + old.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用该findOne方法获取旧实体,但这将返回新事件.可能是因为当前会话中的Hibernate/Repository缓存.
有没有办法获得旧实体?
我需要这个来确定给定的属性是否被更改.如果属性是更改,我需要执行一些操作.
这些罐子都是新发布的,并且拥有最新的Java EE应用程序解决方案.但是我在hibernate.cfg.xml中指定hibernate监听器时遇到了问题.
在春季3.1.0之前,LocalSessionFactroyBean持有一个保存eventlisteners的属性.但是使用3.1.0.release没有eventlisteners地图.现在我无法在saveorupdate,postload等上保持模态对象的跟踪,因为它们不是由Spring配置的.你有想法解决这个问题吗?
假设您在两个环境中有四个 MySQL 数据库架构:
foo (产品数据库),bar(正在进行的foodb重组),foo_beta (测试数据库),bar_beta(新结构的测试数据库)。此外,假设您有一个在实体上带有 Hibernate 注释的 Spring Boot 应用程序,如下所示:
@Table(name="customer", schema="bar")
public class Customer { ... }
@Table(name="customer", schema="foo")
public class LegacyCustomer { ... }
Run Code Online (Sandbox Code Playgroud)
在本地开发时没有问题。您模仿本地环境中的生产数据库表名称。但随后您尝试在功能上线之前演示功能并希望将其上传到服务器。您在另一个端口上启动应用程序的另一个实例,并意识到此副本需要指向“foo_beta”和“bar_beta”,而不是“foo”和“bar”!该怎么办!
如果您在应用程序中仅使用一种架构,您可以将架构全部放在一起并指定hibernate.default_schema,但是...您正在使用两种。所以就这样了。
Spring EL --eg@Table(name="customer", schema="${myApp.schemaName}")不是一个选项--(甚至有一些傲慢的“没人需要这个”评论),所以如果动态定义模式是荒谬的,那么人们会怎么做?除了,你知道,一开始就没有进入这个荒谬的场景。
我是 Spring AOP(以及一般的 AOP)的新手,需要实现以下内容:
@HasPermission(operation=SecurityOperation.ACTIVITY_EDIT, object="#act")
public Activity updateActivity(Activity act)
{
...
}
Run Code Online (Sandbox Code Playgroud)
@HasPermission 是我自定义的注解,用来标记所有需要预授权的方法。我正在使用基于 Apache Shiro 的自定义安全检查实现。一般来说,我想我需要定义切入点来匹配所有带注释的方法,并提供方面的实现(之前或周围)。
我的问题是重新。方面的实施。
我想在保存一个对象的子集合之前运行一些检查(cascade = all).
我正在使用Spring Boot和Spring Data JPA,并且想知道什么方法是最好的:Hibernate监听器或拦截器.每个的优点/缺点是什么?你碰巧有一个你认为最好的方法的例子吗?
我在使用XML配置之前使用过Hibernate监听器,如下所示:
<property name="eventListeners">
<map>
<entry key="post-update">
<list>
<ref bean="myListener" />
</list>
</entry>
</map>
</property>
Run Code Online (Sandbox Code Playgroud)
在会议工厂(旧项目).但是现在我的大多数配置都在注释中(导致Spring Boot)并且我希望尽可能保持简单和轻便,因此拦截器可能是更好的解决方案.
谢谢.
我想知道我们是否可以通过应用程序在@Formula中设置自定义参数。
@Formula(TAX_RATE * price)
private Integer totalPrice;
Run Code Online (Sandbox Code Playgroud)
TAX_RATE 不是数据库中的列,其中“价格”是数据库中的列。
如何通过应用程序在查询运行时设置 TAX_RATE 值?
有人建议使用 Hibernate Interceptor 'onPreparedStatement' 方法。还有更好的办法吗?
加载实体后是否有任何事件发生?我的目标是将此实体添加到 Solr 或 Lucene 索引。EmptyInterceptor OnLoad 事件在对象初始化之前发生。我想在设置对象属性后处理事件。是否可以使用 Hibernate Interceptors 或其他东西?
默认情况下,Spring将空字符串字段保留为数据库中的空字符串。有没有办法使用Spring Boot将任何实体中所有空字符串字段持久化为空字段?
java ×7
hibernate ×6
spring ×2
spring-boot ×2
aop ×1
aspectj ×1
interceptor ×1
jpa ×1
lucene ×1
solr ×1
spring-3 ×1
spring-data ×1
spring-el ×1
spring-mvc ×1