有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案