2014-02-26 48 views
0

有持续映射像org.hibernate.PropertyAccessException而持续多对多关系

Document.java

public class Document { 
    ....... 
    @ManyToMany(targetEntity = Category.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinTable(name = "fideuram_gup_documents_in_categories", 
     joinColumns = @JoinColumn(name="fk_document"), 
     inverseJoinColumns = @JoinColumn(name = "fk_category")) 
    private Set<Category> categories = new HashSet<Category>(); 
    ....... 
} 

那些类别是我的模型的一个多个实体,我不一个多对多的关系问题粘贴在这里,因为它没有携带这个关系的反向映射,并且只有一个ID和一个名字。

当我试图坚持文档,但是我得到以下错误:

org.hibernate.PropertyAccessException: could not get a field value by reflection getter of it.ardesia.fideuram.gup.model.Category.id 

我冲浪关于它的网页,但没有页面涉及到多对多的关系。当然,我对实体文档的所有ManyToOne关系都可以正常工作。

我使用:

spring-data-jpa:1.2.0.RELEASE 
hibernate-core:4.2.2.Final 
hibernate-entitymanager:4.2.2.final 

UPDATE

所有实体暴露每个字段默认构造函数和getter/setter方法。或者,更精确的是,我使用Spring Roo来创建实体,并在编译时自动注入getters和setter。

+0

是你能够在根本上解决这个问题呢? – cooler

+1

@cooler我确实做到了,尽管我不能完全记得如何。如果我记得正确的话,这个问题与代码(或元代码)没有关联。这是关于创建冲突的传递依赖关系(导入了不同的JPA规范版本) –

回答

0

您可以使用@javax.persistence.Access注释来测试Hibernate如何访问您的财产;把你的映射类@Access.value设置为

  1. AccessType.FIELD直接字段访问
  2. AccessType.PROPERTY使用存取
0

也许它可以帮助你访问属性,我已经做了同样的,我把我的代码,它会创建一个连接表:

@Entity 
@Table(name = "custom_pizza") 
public class CustomPizza extends BaseEntity { 

private static final long serialVersionUID = 1L; 

// ManyToMany instead of oneToMany in order to don't have the unique 
// constraint on each primary key of the join table 
@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "custom_pizza_topping", joinColumns = @JoinColumn(name = "custom_pizza_id"), inverseJoinColumns = @JoinColumn(name = "topping_id")) 
private Set<Topping> toppings = new HashSet<Topping>(); 

public void addTopping(Topping topping) { 
    toppings.add(topping); 
} 

public void removeTopping(Topping topping) { 
    toppings.remove(topping); 
} 
... 

我的馅料:

@Entity 
@Table(name = "topping") 
public class Topping extends BaseEntity { 

private static final long serialVersionUID = 1L; 

@Column(name = "name", nullable = false) 
private String name; 

@Column(name = "price", nullable = false) 
private float price; 
.... 

和BaseEntity