在我们的后端系统中,有许多情况需要更新对象,例如:更新商品,更新商品价格,更新用户,更新状态,更新订单(取消,更新价格)等。现在有些对象我们有一个特殊的日志表,例如order_update_log,用于记录器更新操作。一些只有记录器,例如,
1.8.7
感觉处理这些琐碎的事情非常讨厌,确实存在一些更好的方式/工具来处理这样的记录器吗?
答案 0 :(得分:1)
如果您使用ORM来保存数据,您可以使用Hibernate的Listners /事件来响应数据更新(并将它们记录到数据库或审核日志等) 对于休眠,这里详细说明了这些信息:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html但显然你需要调查你的持久性工具提供给你的内容。
答案 1 :(得分:1)
有很好的东西叫Aspects。
您可以为您的项目编写方面,该项目仅了解跟踪货物对象的更改。假设您有Goods
类:
public class Goods {
private Integer id;
private String name;
private BigDecimal cost;
// Getters, Setters
...
}
映射到具有相应字段的数据库表商品:
CREATE TABLE `goods` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` varchar NOT NULL,
`cost` DECIMAL NOT NULL,
PRIMARY KEY (`id`)
);
假设您有GoodsService
:
public class GoodsService {
public Goods read(Integer id) {
Goods goods = /* Read goods from database */
return goods;
}
public void write(Goods goods) {
/* Write goods to database */
}
}
使用GoodsController
的和GoodsService
:
public class GoodsController {
private GoodsService goodsService;
public void updateGoods(Integer id, String name, BigDecimal cost) {
Goods goods = goodsService.read(id);
goods.setName(name);
goods.setCost(cost);
goodsService.write(goods);
}
}
因此,我们为您的项目添加一些方面的魔力来跟踪商品的变化。现在创建另一个表,其中包含用于存储更新user
对象的datetime
和goods
的其他字段:
CREATE TABLE `goods_log` (
`revision` INT NOT NULL AUTO_INCREMENT,
`id` INT NOT NULL,
`name` varchar NOT NULL,
`cost` DECIMAL NOT NULL,
`user` varchar NOT NULL,
`timestamp` DATETIME NOT NULL,
PRIMARY KEY (`revision`,`id`)
);
写方面课:
@Aspect
public class GoodsLogger {
@Before(value = "execution(* org.antonu.service.GoodsService.write(..)) && args(goods)")
public void logWrite(Goods goods) {
// Get current user and timestamp,
// Write it to goods_log table, as well as goods data
}
}
就是这样!您的业务逻辑代码没有改变,读起来很清楚。但是每次调用GoodsService的write方法,你都会在goods_log中记录新的商品状态。
要使此代码正常工作,应使用AJC编译器进行编译,还应包含aspectjrt库。它可以通过maven轻松完成:
<properties>
<aspectj.version>1.8.7</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
现代IDE Intellij Idea应该使用上面的maven配置自动使用AJC
编译器。如果没有,则必须通过File - Settings - 'Build, Execution, Deployment' - Compiler - Java Compiler - Use compiler: Ajc.
AJC编译器路径配置编译器:<path_to>/aspectjtools-1.8.7.jar