【问题标题】:Error while Inserting into many to many relationship using hibernate使用休眠插入多对多关系时出错
【发布时间】:2014-04-24 09:39:56
【问题描述】:

我正在尝试使用 hibernate 插入多对多关系,但出现此错误。

2014-04-24 14:50:47,820 错误 [BasicPropertyAccessor.java:118]:类中的 IllegalArgumentException:com.jellboi.maniartyre.entities.AbstractEntity,属性的设置方法:pkey

2014-04-24 14:50:47,827 错误 [BasicPropertyAccessor.java:122]:预期类型:java.lang.Long,实际值:org.hibernate.id.IdentifierGeneratorHelper$2

2014 年 4 月 24 日下午 2:55:25 org.apache.catalina.core.StandardWrapperValve 调用 严重:servlet applicationController 的 Servlet.service() 抛出异常 java.lang.IllegalArgumentException: java.lang.ClassCastException@17d66f6 在 sun.reflect.GeneratedMethodAccessor27.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597)

这是我正在尝试的代码。 VehicleProduct 类

@Entity
@Table(name="m_vehicle_product")
@AssociationOverrides({
@AssociationOverride(name = "pk.vehicle",
        joinColumns = @JoinColumn(name = "vehicle_id")),
@AssociationOverride(name = "pk.product",
        joinColumns = @JoinColumn(name = "product_id")),
 })
public class VehicleProduct extends AbstractEntity{

private String service;
private VehicleProductId pk = new VehicleProductId();

@Column(name = "service")
public String getService() {
    return service;
}

public void setService(String service) {
    this.service = service;
}

@EmbeddedId
public VehicleProductId getPk() {
    return pk;
}

public void setPk(VehicleProductId pk) {
    this.pk = pk;
}


@Transient
public Product getProduct(){
    return getPk().getProduct();
}

public void setProduct(Product product){
    getPk().setProduct(product);
}

@Transient
public Vehicle getVehicle(){
    return getPk().getVehicle();
}

public void setVehicle(Vehicle vehicle){
    getPk().setVehicle(vehicle);
}   
}

VehicleProductId 类

@Embeddable
public class VehicleProductId implements java.io.Serializable {

private Vehicle vehicle;
private Product product;

@ManyToOne
public Vehicle getVehicle() {
    return vehicle;
}

public void setVehicle(Vehicle vehicle) {
    this.vehicle = vehicle;
}

@ManyToOne
public Product getProduct() {
    return product;
}

public void setProduct(Product product) {
    this.product = product;
}   
}

这就是我插入的方式。

for(int i=0;i<jobid.length;i++){
            product  = productService.findByPkey(jobid[i]);
            vehicleProduct.setProduct(product);
            vehicleProduct.setService(jobdesc[i]);  
            pkey2 = vehicleProductService.save(vehicleProduct);
}

请指导我。几个小时以来一直在尝试解决这个问题。

编辑

@MappedSuperclass
public class AbstractEntity implements IEntity, Serializable{

private static final long serialVersionUID = 1L;

private Long pkey;
private Boolean deleted;
private String creator;
private Date created;
private String changer;
private Date changed; 
private Long version;


@Id
@GeneratedValue
@Column(name="pkey")
public Long getPkey() {
    return pkey;
}
public void setPkey(Long pkey) {
    this.pkey = pkey;
}

@Column(name="deleted")
@XmlTransient
public Boolean getDeleted() {
    return deleted;
}
public void setDeleted(Boolean deleted) {
    this.deleted = deleted;
}

@Column(name="creator")
public String getCreator() {
    return creator;
}
}........

它包含所有这些 getter 和 setter。

【问题讨论】:

  • 你能贴出 AbstractEntity 的代码吗?
  • @Shiraaz.M 添加了代码。

标签: java spring hibernate


【解决方案1】:

你的主要问题是:

2014-04-24 14:50:47,820 错误 [BasicPropertyAccessor.java:118]:类中的 IllegalArgumentException:com.jellboi.maniartyre.entities.AbstractEntity,属性的设置方法:pkey

2014-04-24 14:50:47,827 错误 [BasicPropertyAccessor.java:122]:预期类型:java.lang.Long,实际值:org.hibernate.id.IdentifierGeneratorHelper$2

如果您查看您的代码,您会在 AbstractEntity 上定义一个 @Id,在您的 VehicleProduct 上定义一个 @EmbeddedId

我不确定您的数据库表应该是什么样子,但它似乎包含 AbstractEntity 中的列以及 VehicleProduct 中定义的列。如果这些列不应该存在,那么您不应该从 AbstractEntity 继承。如果他们注定要在那里,那么考虑将 @EmbeddedId 变成 @Embedded 并为业务密钥强制执行唯一约束。

【讨论】:

  • 哇@Shiraaz.M 太棒了。我刚刚发现“@Id”和“@EmbeddedId”不能一起使用,不知何故我错过了这一点。谢谢您的帮助。你让我的生活变得如此轻松。 :)
【解决方案2】:

2014-04-24 14:50:47,820 错误 [BasicPropertyAccessor.java:118]:类中的 IllegalArgumentException:com.jellboi.maniartyre.entities.AbstractEntity,属性的设置方法:pkey

2014-04-24 14:50:47,827 错误 [BasicPropertyAccessor.java:122]:预期类型:java.lang.Long,实际值:org.hibernate.id.IdentifierGeneratorHelper$2

我不知道这是你的情况,但看看你的踪迹我不得不说休眠不支持带有身份部分的复合 PK

Hibernate Jira composite PK identity part

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多