【问题标题】:Hibernate has troubles accessing value of annotated propertyHibernate 无法访问带注释的属性的值
【发布时间】:2014-09-19 13:43:26
【问题描述】:

Hibernate 抛出异常:

    org.hibernate.PropertyAccessException: 
could not get a field value by reflection getter of test.model.Part.part

零件实体类:

@Table(name = "part")
@Entity
public class Part implements Serializable {

    @Id @GeneratedValue
    @Column(name = "part")
    private int part;

    public int getPart() {
        return part;
    }

    public void setPart(int part) {
        this.part = part;
        }
@OneToMany(mappedBy = "part")
        private Collection<ProductPart> productPartsByPart;
        public Collection<ProductPart> getProductPartsByPart() {
            return productPartsByPart;
        }
    .....
  }

似乎实体类具有正确的注释,但 Hibernate 无法访问 idPart 表中的 主键 属性。如何解决?

它被调用:

ProductPart productPart  = (ProductPart) sessionFactory
                .getCurrentSession()
                .createCriteria(ProductPart.class)
                .add(Restrictions.eq("part", cPartId))
                .add(Restrictions.eq("product", productId)).uniqueResult();

更新:

    Caused by: java.lang.IllegalArgumentException: 
Can not set int field Part.part   to java.lang.Integer

更新 2: 我有 product_part 表,它有 fk 并在 part 表中引用 part。我必须使用@OneToMany(mappedBy = "part") 吗?

@Entity
@Table (name = "part")
public class Part implements Serializable {

    @Id @GeneratedValue
    @Column(name = "part")
    @OneToMany(mappedBy = "part")
    private int  part;

UPDATE3

当我声明我只需要在 product_part 表上执行搜索时,我不明白为什么 Hibernate 尝试访问 Part 表。也没有必要访问其他表,因为我只需要 product_part 中的字段,该字段已经给出了 partproduct 的值(这两个都是外键)......

更新4:

@Entity
@Table(name = "product_part")
public class ProductPart implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name = "product", referencedColumnName = "product", nullable = false)
    private Product product;

    public Product getProduct() {
        return product;
    }

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


    @JoinColumn(name = "part", referencedColumnName = "part", nullable = false)
    @ManyToOne
    private Part part;

    public Part getPart() {
        return part;
    }

    public void setPart(Part partByPart) {
        this.part = partByPart;
    }
}

【问题讨论】:

  • 您是否尝试使用 Table 注释反转实体注释?
  • 仅使用您提供的信息,看起来 Hibernate 能够访问 getPart() 方法,但未设置字段的 int 值。如果您尝试访问某个持久对象,请验证数据库上的 part 字段是否设置正确。
  • 将您的“部分”字段类型更改为整数
  • @Snorky35,仍然有错误Can not set java.lang.Integer field .... to java.lang.Integer
  • 你应该参考part.part吧?

标签: java hibernate


【解决方案1】:

您的零件在您的 ProductPart 中是如何引用的?

应该是这样的

ProductPart{

@ManyToOne
private Part part;
}

猜对了

.add(Restrictions.eq("part", cPartId)) 更改为.add(Restrictions.eq("part.part", cPartId))

编辑:

ProductPart productPart  = (ProductPart) sessionFactory
                .getCurrentSession()
                .createCriteria(ProductPart.class)
                .add(Restrictions.eq("part.part", cPartId))
                .add(Restrictions.eq("product", productId)).uniqueResult();//here similarly access your Product's @Id
                                                                           //something like product.productId

【讨论】:

  • 当更改为.add(Restrictions.eq("product_part.part", cPartId)) .add(Restrictions.eq("product_part.product", productId)).uniqueResult(); 时,它给出QueryException: could not resolve property: product_part of: test.model.ProductPart 其中product_part 是我们搜索的表
  • @RCola,你能发布你的 productpart 课程吗?
  • @RCola,您的 productpart 没有 product_part 属性。所以你在做什么是错误的。试试我的编辑,如果它有效,那么我会解释这些事情。
  • 作为部分和产品是外键,它应该去原始表以获取整个对象或行。您的 product_part 表中只有 productid 和 partid ,对吗?把它放在一边,另外,如果我是正确的,您将 partId 和 productId 作为整数的参数传递。如何检查类型 Part 上的 equals 类型以键入 Int?所以这就是为什么你必须访问 part.part ,它是一个 int 供 partId 匹配。希望你明白了。
  • 因为当您说 .add(Restrictions.eq("part", cPartId)) 时,您的 productpart 实体中的部件类型是什么,它是 Part 类型,对吗?什么是 cPartId,它是 int ,对吗?因此,即使您在 product_part 表上进行搜索,product_part.part 的类型也不能与整数进行比较,但 part.part 是一个整数,您需要在其上使用 cPartId 执行等于,抱歉消息冗长
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多