首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用@ManyToMany审计@JoinTable

如何使用@ManyToMany审计@JoinTable
EN

Stack Overflow用户
提问于 2020-10-16 07:03:28
回答 1查看 1.3K关注 0票数 1

我正在开发一个带有H2数据库的Spring项目。我有两个实体PortfolioReport,两者之间有一个多到多的联系。我希望对这些实体进行审计,因此我遵循本教程通过带有自定义字段的AuditorAware接口进行审计。

对这两个实体进行了良好的审计,并在数据库中创建了列。但是,未对联接表portfolio_reports进行审计。如何对联接表进行审计?

Portfolio.java

代码语言:javascript
复制
@Entity
@Table(name = "portfolio")
public class Portfolio extends Auditable<String> implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    @Unique
    private String name;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinTable(name = "portfolio_report", joinColumns = @JoinColumn(name = "portfolio_id"), inverseJoinColumns = @JoinColumn(name = "report_id"))
    private List<Report> reports;
    
    // Getters and setters
}

Report.java

代码语言:javascript
复制
@Entity
@Table(name = "report")
public class Report extends Auditable<String> implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "axioma_id")
    private Long axiomaId;

    @Column(name = "name")
    private String name;

    @AuditJoinTable
    @ManyToMany(mappedBy = "reports", cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    private List<Portfolio> portfolios;

    // Getters and setters
}

Auditable.java

代码语言:javascript
复制
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable<U> {

    @Version
    @Column(name = "version_no")
    protected Long versionNo;

    @CreatedDate
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_date")
    protected Date createdDate;

    @LastModifiedDate
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "modified_date")
    protected Date modifiedDate;

}

AuditorAwareImpl.java

代码语言:javascript
复制
public class AuditorAwareImpl implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        return Optional.of("Admin");
    }
}

PersistenceConfiguration.java

代码语言:javascript
复制
@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class PersistenceConfiguration {

    @Bean
    public AuditorAware<String> auditorAware() {
        return new AuditorAwareImpl();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-10-16 07:57:50

问题:

显然,在这里,Auditable应该在中间表中添加一些列,以维护PortfolioReport之间的关系,并且该表是在场景后面创建的,并且您无法在程序中访问该表。只有hibernate可以使用该表来维护实体之间的关系并执行联接操作。

解决方案:

在这里,您应该使Join表显式地维护PortfolioReport之间的多到多关系,这样您的程序中就可以有可以从Auditable扩展的实体,比如PortfolioReport。请阅读以下帖子以了解如何做到这一点:使用JPA和Hibernate时,使用额外列映射多到多关联的最佳方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64384395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档