2014-07-11 16 views
6

Tôi có lỗi này khi cố gắng liệt kê các đối tượng từ cơ sở dữ liệu với tiêu chuẩn Hibernate trang trí bằng Hạn chế đơn giản"IllegalArgumentException xảy ra gọi getter của" khi chạy tiêu chuẩn với SINGLE_TABLE chiến lược Inheritance

Criteria criteria = session.createCriteria(Licence.class); 
criteria.add(Restrictions.eq("gym", gym.getId())); 
List<Licence> list = criteria.list(); 

Tôi có hai lớp: Licence trong đó có liên kết đến Gym. Hai lớp học này đang mở rộng DataModel để quản lý thông tin về phiên bản dữ liệu - (sáng tạo và biến đổi, ai và khi nào). Điều gì cũng quan trọng là hai lớp đó có @Inheritance(strategy = InheritanceType.SINGLE_TABLE).

Giấy phép

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public class Licence extends DataModel implements Serializable { 

    private Gym gym; 
    private String licenceType; 
    private String keyCode; 
    private Date expireDate; 
    private ELicenceExpiry expired; 

    public Licence() { 
    } 

    @ManyToOne 
    @JoinColumn(name="gym_id") 
    public Gym getGym() { 
     return gym; 
    } 

    public void setGym(Gym gym) { 
     this.gym = gym; 
    } 

    @Column(name = "licence_type") 
    public String getLicenceType() { 
     return licenceType; 
    } 

    public void setLicenceType(String licenceType) { 
     this.licenceType = licenceType; 
    } 

    @Column(name = "key_code") 
    public String getKeyCode() { 
     return keyCode; 
    } 

    public void setKeyCode(String keyCode) { 
     this.keyCode = keyCode; 
    } 

    @Column(name = "expire_date") 
    public Date getExpireDate() { 
     return expireDate; 
    } 

    public void setExpireDate(Date expireDate) { 
     this.expireDate = expireDate; 
    } 

    @Column(name = "expired") 
    @Enumerated(EnumType.ORDINAL) 
    public ELicenceExpiry getExpired() { 
     return expired; 
    } 
    public void setExpired(ELicenceExpiry expired) { 
     this.expired = expired; 
    } 
} 

phòng tập thể dục

@Entity 
@Inheritance(strategy= InheritanceType.SINGLE_TABLE) 
public class Gym extends DataModel implements Serializable{ 

    private String shortName; 
    private String name; 
    private String nip; 
    private String street; 
    private String postCode; 
    private String localization; 
    private String telephone; 

    public Gym(){}; 

    @Column(name="short_name") 
    public String getShortName() { 
     return shortName; 
    } 
    public void setShortName(String shortName) { 
     this.shortName = shortName; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getNip() { 
     return nip; 
    } 
    public void setNip(String nip) { 
     this.nip = nip; 
    } 
    public String getStreet() { 
     return street; 
    } 
    public void setStreet(String street) { 
     this.street = street; 
    } 
    @Column(name="post_code") 
    public String getPostCode() { 
     return postCode; 
    } 
    public void setPostCode(String postCode) { 
     this.postCode = postCode; 
    } 
    public String getLocalization() { 
     return localization; 
    } 
    public void setLocalization(String localization) { 
     this.localization = localization; 
    } 
    public String getTelephone() { 
     return telephone; 
    } 
    public void setTelephone(String telephone) { 
     this.telephone = telephone; 
    } 
} 

DataModel

@MappedSuperclass 
public abstract class DataModel implements Serializable{ 
    protected Long id; 
    protected String editor; 
    protected Date editDate; 
    protected Time editTime; 
    protected int dataState; 

    @Id 
    @GeneratedValue 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    public String getEditor() { 
     return editor; 
    } 
    public void setEditor(String editor) { 
     this.editor = editor; 
    } 
    @Column(name="edit_date") 
    public Date getEditDate() { 
     return editDate; 
    } 
    public void setEditDate(Date editDate) { 
     this.editDate = editDate; 
    } 
    @Column(name="edit_time") 
    public Time getEditTime() { 
     return editTime; 
    } 
    public void setEditTime(Time editTime) { 
     this.editTime = editTime; 
    } 
    @Column(name="data_state") 
    public int getDataState() { 
     return dataState; 
    } 
    public void setDataState(int dataState) { 
     this.dataState = dataState; 
    } 
} 

MySQL

CREATE TABLE licence(
    id INT(5) NOT NULL AUTO_INCREMENT, 
    gym_id int(3), 
    licence_type VARCHAR(10), 
    key_code VARCHAR(10), 
    expire_date DATE, 
    expired INT(1), 
    editor VARCHAR(10), 
    edit_date DATE, 
    edit_time TIME, 
    data_state INT(1) NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY (gym_id) REFERENCES gym(id) ON DELETE SET NULL 
); 

CREATE TABLE gym(
    id INT(3) NOT NULL AUTO_INCREMENT, 
    short_name VARCHAR(16) NOT NULL UNIQUE, 
    name VARCHAR(100) NOT NULL, 
    street VARCHAR(100), 
    post_code VARCHAR(6), 
    localization VARCHAR(64), 
    nip VARCHAR(13), 
    telephone VARCHAR(15), 
    editor VARCHAR(10), 
    edit_date DATE, 
    edit_time TIME, 
    data_state INT(1) NOT NULL, 
    PRIMARY KEY (id) 
); 

Ngoại lệ:

org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of pl.fitpartner.model.DataModel.id 
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:192) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746) 
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465) 
(...) 
Caused by: java.lang.IllegalArgumentException: [email protected] 
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169) 
    ... 28 more 

Tôi đang làm gì sai?

Trả lời

5

Cố gắng sử dụng

criteria.add(Restrictions.eq("gym", gym)); 

tức là bạn đặt gym như là đối số thứ hai của criteria.add thay vì gym.getId().

5

Tôi đã phát hiện ra vấn đề là gì. Mặc dù ngoại lệ hibernate không phải là rất nhiều thông tin, câu trả lời là thực sự tầm thường. Trong hạn chế của một tiêu chí nhất định tôi phải chính xác hơn, lĩnh vực mà tôi muốn tham khảo trong một truy vấn. Nó sẽ giống như thế này:

Criteria criteria = session.createCriteria(Licence.class); 
criteria.add(Restrictions.eq("gym.id", gym.getId())); 
List<Licence> list = criteria.list(); 

Đối với lời giải thích hơn Bạn có thể thấy câu hỏi này: Hibernate query a foreign key field with ID

Các vấn đề liên quan