java Hibernate回调用于许多联接表操作?
考虑这种情况:
- 汽车可能有很多问题
- 一个问题可以由多辆汽车共同解决
我想使用连接表的多对多映射来定义这种关系
我希望在所有三个表上自动维护一个通用的列修改(是的,我可以用数据库触发器来实现,但这不是我的目标)
我用各种hibernate实体侦听器和拦截器进行了实验。它们工作得很好-除了联接表
是否有人知道为什么在连接表上插入或更新行时,诸如preInsert和onSave之类的回调不会触发
我正在使用:
- 休眠4.3.10。决赛
- spring数据JPA1.8.1。释放(这有关系吗?)李>
基本实体类:
@MappedSuperclass
public abstract class BaseEntity {
@Column(name = "MODIFIED_TS")
private Timestamp modifiedTs;
}
汽车:
@Entity
@Table(name = "CAR")
public class Car extends BaseEntity {
@Id
@Column(name = "ID", nullable = false)
private long id;
@Column(name = "LICENSE_PLATE_NUMBER", nullable = false, length = 20)
private String licensePlateNumber;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CAR_ISSUE", inverseJoinColumns = {@JoinColumn(name = "CAR_ID")},
joinColumns = {@JoinColumn(name = "ISSUE_ID")})
private Collection<Issue> issues;
}
问题:
@Entity
@Table(name = "ISSUE")
public class Issue extends BaseEntity {
@Id
@Column(name = "ID", nullable = false)
private long id;
@Column(name = "TEXT", nullable = false, length = 2000)
private String text;
}
和CarIssue:
@Entity
@Table(name = "CAR_ISSUE")
public class CarIssue extends BaseEntity {
@Id
@Column(name = "ISSUE_ID", nullable = false)
private long issueId;
@Id
@Column(name = "CAR_ID", nullable = false)
private long carId;
}
我的听众:
public class MyEntityListener implements PreUpdateEventListener, PreInsertEventListener {
public boolean setAudit(Object entity, String[] properties, Object[] state) {
if (entity instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) entity;
baseEntity.setModifiedTs(new Timestamp(new Date().getTime()));
List<String> propertiesList = Arrays.asList(properties);
state[propertiesList.indexOf("modifiedTs")] = baseEntity.getModifiedTs();
}
return false;
}
@Override
public boolean onPreInsert(PreInsertEvent event) {
return setAudit(event.getEntity(), event.getPersister().getPropertyNames(), event.getState());
}
@Override
public boolean onPreUpdate(PreUpdateEvent event) {
return setAudit(event.getEntity(), event.getPersister().getPropertyNames(), event.getState());
}
}
最后,这段代码:
Car car = new Car();
car.setLicensePlateNumber("ABC123");
ArrayList<Issue> issues = new ArrayList<>();
Issue issue = new Issue();
issue.setDescription("Two wheels missing");
issues.add(issue);
car.setIssues(issues);
carRepo.save(car);
这很好-我在所有三个表中都有一行-但是修改后的只会为CAR和ISSUE填充
非常感谢您的帮助:-)
共 (0) 个答案