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] 删除。
我来说两句