Hibernate中的ManyToMany映射引用错误(api生成的表名)表Spring Boot

短跑运动员

Hibernate @ManyToMany映射生成不同的联接表名称,并尝试从中获取数据(不存在)。

@JoinTable在实体映射中定义为“ productcolumn_customfields”的联接表,但是期望有一个不同的表并抛出以下内容

错误:

表' product_columns_details_customviews '不存在

使用的技术有: Spring-boot,Spring-data-Jpa,Hibernate,MySql

完全错误是:

org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取ResultSet。SQL [n / a];嵌套的异常是org.hibernate.exception.SQLGrammarException:无法在org.springframework.orm.jpa.vendor.HibernateJlateDate上的org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:261)处提取ResultSet。 (HibernateJpaDialect.java:244)在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:488)在org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTransorg.java.spring:59) org.springframework.dao.support上的dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)。

自定义视图实体为:

@Entity
@Table(name = "custom_views")
public class CustomViews implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -7325379776348403853L;

    @Id
    @GenericGenerator(name="generator", strategy="increment")
    @GeneratedValue(generator="generator")
    @Column(name="custom_id")
    private Long customId;

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

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REMOVE},fetch=FetchType.LAZY)
    @JoinTable(name = "productcolumn_customfields", 
        joinColumns = { @JoinColumn(name = "cv_id") },
        inverseJoinColumns = { @JoinColumn(name = "pcd_id",nullable = false, updatable = false) })
    private List<ProductColumnsDetailsCV> productColumnsDetails;

    public CustomViews(){
        super();
    }

    public CustomViews(Long customId, String viewName, User user, List<ProductColumnsDetailsCV> productColumnsDetails) {
        super();
        this.customId = customId;
        this.viewName = viewName;
        this.user = user;
        this.productColumnsDetails = productColumnsDetails;
    }

    /**
     * @return the customId
     */
    public Long getCustomId() {
        return customId;
    }

    /**
     * @param customId the customId to set
     */
    public void setCustomId(Long customId) {
        this.customId = customId;
    }

    /**
     * @return the viewName
     */
    public String getViewName() {
        return viewName;
    }

    /**
     * @param viewName the viewName to set
     */
    public void setViewName(String viewName) {
        this.viewName = viewName;
    }

    /**
     * @return the user
     */
    public User getUser() {
        return user;
    }

    /**
     * @param user the user to set
     */
    public void setUser(User user) {
        this.user = user;
    }

    /**
     * @return the productColumnsDetails
     */
    public List<ProductColumnsDetailsCV> getProductColumnsDetails() {
        return productColumnsDetails;
    }

    /**
     * @param productColumnsDetails the productColumnsDetails to set
     */
    public void setProductColumnsDetails(List<ProductColumnsDetailsCV> productColumnsDetails) {
        this.productColumnsDetails = productColumnsDetails;
    }

}

产品栏详细信息实体:

@Entity
@Table(name = "product_columns_details")
public class ProductColumnsDetailsCV implements Serializable{

    private static final long serialVersionUID = 7685428544522743567L;

    @Id
    @GenericGenerator(name="generator", strategy="increment")
    @GeneratedValue(generator="generator")
    @Column(name="pid")
    private Long pid;

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

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

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

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

    @Column(name="is_pk")
    private boolean isPk;

    @Column(name="is_sortable")
    private boolean isSortable;

    @Column(name="order_")
    private int order;

    @Column(name="is_popup")
    private boolean isPopUp;


    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REMOVE})
    @JoinColumn(name="productColumnsDetails")
    private List<CustomViews> customviews;


    public ProductColumnsDetailsCV() {
        super();
    }


    /**
     * @param pid
     * @param displayName
     * @param columnName
     * @param actualName
     * @param customFilter
     */
    public ProductColumnsDetailsCV(Long pid, String displayName, String columnName, String actualName) {

        this.pid = pid;
        this.displayName = displayName;
        this.columnName = columnName;
        this.actualName = actualName;
    }

    //Getters & Setter

}

表格:

CREATE TABLE `productcolumn_customfields` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `pcd_id` bigint(20) DEFAULT NULL,
  `cv_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id_pid_productcoldetails_idx` (`pcd_id`),
  KEY `id_cvid_customviews_idx` (`cv_id`),
  CONSTRAINT `fk_pcd_id_productcolumndet` FOREIGN KEY (`pcd_id`) REFERENCES `product_columns_details` (`pid`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `id_cvid_customviews` FOREIGN KEY (`cv_id`) REFERENCES `custom_views` (`custom_id`) ON DELETE CASCADE ON UPDATE CASCADE

CREATE TABLE `product_columns_details` (
  `pid` bigint(20) NOT NULL AUTO_INCREMENT,
  `display_name` varchar(255) DEFAULT NULL,
  `column_name` varchar(255) DEFAULT NULL,
  `actual_name` varchar(255) DEFAULT NULL,
  `type` varchar(25) NOT NULL DEFAULT 'String',
  `is_pk` bit(1) NOT NULL DEFAULT b'0',
  `is_sortable` bit(1) NOT NULL DEFAULT b'0',
  `order_` int(11) NOT NULL DEFAULT '0',
  `is_popup` bit(1) NOT NULL DEFAULT b'0',
  PRIMARY KEY (`pid`),
  UNIQUE KEY `actual_name_UNIQUE` (`actual_name`)

CREATE TABLE `custom_views` (
  `custom_id` bigint(30) NOT NULL AUTO_INCREMENT,
  `view_name` varchar(255) NOT NULL,
  `user_id` bigint(20) NOT NULL,
  PRIMARY KEY (`custom_id`),
  KEY `custom_views_ibfk_1` (`user_id`),
  CONSTRAINT `custom_views_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user`enter code here`_id`) ON DELETE CASCADE ON UPDATE CASCADE
)
短跑运动员

在这里发生问题是因为双方(在实体中)都强制休眠以进行many-to-many映射,这是错误的。这是Resson休眠状态,假设联接表名称为product_columns_details_customviews,该表不存在并且不从配置(在Entity的注释中CustomViews获取表名,productcolumn_customfields

现有代码:

@Entity
@Table(name = "product_columns_details")
public class ProductColumnsDetailsCV implements Serializable{
...
...
...
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name="productColumnsDetails")
private List<CustomViews> customviews;

@Entity
@Table(name = "custom_views")
public class CustomViews implements Serializable{
...
...
...
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REMOVE},fetch=FetchType.LAZY)
@JoinTable(name = "productcolumn_customfields", 
    joinColumns = { @JoinColumn(name = "cv_id") },
    inverseJoinColumns = { @JoinColumn(name = "pcd_id",nullable = false, updatable = false) })
private List<ProductColumnsDetailsCV> productColumnsDetails;

唯一需要的更正是:

需要在ProductColumnsDetailsCV中更改实体映射,如下所示。

@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REMOVE}, mappedBy = "productColumnsDetails")
private List<CustomViews> customviews;
  • 删除了注释 @JoinColumn(name="productColumnsDetails")

  • 添加的属性的mappedBy@ManyToMany

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章