使用@EntityListeners
注解可以实现实体对象的自动赋值。该注解作用在JPA实体类上,用于指定监听器。
下面是使用@EntityListeners
实现自动赋值的完整攻略。
1. 定义监听器
首先需要定义一个实体监听器,实现javax.persistence.event.EntityListener
接口,重写对应的方法,如下所示:
public class EntityListener implements javax.persistence.event.EntityListener<MyEntity> {
@Override
public void prePersist(MyEntity entity) {
// 设置创建时间为当前时间
entity.setCreateTime(new Date());
// 设置更新时间为创建时间
entity.setUpdateTime(entity.getCreateTime());
}
@Override
public void preUpdate(MyEntity entity) {
// 设置更新时间为当前时间
entity.setUpdateTime(new Date());
}
}
该监听器会在实体对象的插入和更新操作前被调用,修改实体对象的属性值。
2. 在实体对象中使用@EntityListeners注解
在实体对象上使用@EntityListeners
注解指定监听器,如下所示:
@Entity
@Table(name = "my_entity")
@EntityListeners(EntityListener.class)
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "create_time")
private Date createTime;
@Column(name = "update_time")
private Date updateTime;
// getter/setter 省略
}
该实体对象被插入或更新时,会自动调用注册的实体监听器对创建/更新时间进行赋值。
3. 测试示例
在实体类上增加了@EntityListeners(EntityListener.class)
的注解后,在保存或更新该实体时,会自动调用注册的实体监听器对创建/更新时间进行赋值。
示例如下:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class MyEntityTest {
@Autowired
private MyEntityRepository myEntityRepository;
@Test
public void testCreate() {
MyEntity entity = new MyEntity();
entity.setName("Test");
myEntityRepository.save(entity);
Assert.assertNotNull(entity.getCreateTime());
Assert.assertNotNull(entity.getUpdateTime());
}
@Test
public void testUpdate() {
MyEntity entity = myEntityRepository.findByName("Test");
entity.setName("Test_Update");
myEntityRepository.save(entity);
Assert.assertNotNull(entity.getUpdateTime());
}
}
该测试用例先新增一个实体对象,然后修改实体对象的属性值并更新,最后断言创建时间和更新时间是否被正确赋值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Jpa 如何使用@EntityListeners 实现实体对象的自动赋值 - Python技术站