簡體   English   中英

休眠-此映射正確嗎? 無法通過反射吸氣劑獲得字段值?

[英]Hibernate - Is this mapping correct? could not get a field value by reflection getter?

為什么會出現此錯誤? 柯洛德,你幫我嗎? 我使用的是Hibernate 3.5.4-Final,MySQL 5.6,Tomcat 8。

Exception in thread "main" org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.hibernatetest.entity.User.userId
at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852)
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3560)`enter code here`
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:204)
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:449)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:141)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:567)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1612)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.doList(Loader.java:2294)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
at org.hibernate.loader.Loader.list(Loader.java:2167)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.hibernatetest.repository.MessageRepository.outbox(MessageRepository.java:81)
at com.hibernatetest.test.Test.main(Test.java:34)

Caused by: java.lang.IllegalArgumentException: Can not set long field com.hibernatetest.entity.User.userId to java.lang.Long
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
at sun.reflect.UnsafeLongFieldAccessorImpl.getLong(Unknown Source)
at sun.reflect.UnsafeLongFieldAccessorImpl.get(Unknown Source)
at java.lang.reflect.Field.get(Unknown Source)
at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
... 22 more

這是我的用戶實體:

@Entity
@Table(name = "User")
@XmlRootElement
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userId", updatable = false, nullable = false)
private long userId;

@Column(name = "userName", nullable = false, unique = true, length = 89)
private String userName;

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

@JsonIgnore
@OneToMany(mappedBy = "senderUserId")
private List<Message> outbox;

@JsonIgnore
@OneToMany(mappedBy = "receiverUserId")
private List<Message> inbox;

...GETTER and SETTER...

}

這是我的消息實體:

@Entity
@Table(name = "Message")
@XmlRootElement
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "messageId")
    private long messageId;

    @Column(name = "messageText")
    private String messageText;

    @ManyToOne
    @JoinColumn(name = "senderUserId")
    private User senderUserId;

    @ManyToOne
    @JoinColumn(name = "receiverUserId")
    private User receiverUserId;

    ...GETTER and SETTER...

}

這是我的MessageRepository發件箱方法:

@SuppressWarnings("unchecked")
    public List<Message> outbox(long senderUserId) {
        session.getTransaction().begin();
        Query query = session.createQuery("from Message where senderUserId = :senderUserId");
        query.setParameter("senderUserId", senderUserId);
        session.beginTransaction().commit();
        return query.list();
    }

這是我的基本測試課程。 當我運行這個主要方法時。 我在頂部出現錯誤。

public class Test {

    public static void main(String[] args) {


MessageRepository messageRepository = new MessageRepository();
        UserRepository userRepository = new UserRepository();

        User user = userRepository.get(1);

        List<Message> messages = messageRepository.outbox(user.getUserId());
        for (Message message : messages) {
            System.out.println(message.getMessageText());
        }
}

查詢應為:

Query query = session.createQuery("select m from Message m where m.senderUserId.userId = :senderUserId");

另外,您是否真的定義了所有的getter和setter方法?

使用private Long userId; 而不是private long userId; 通常,不要對@Entity的fileds使用原語。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM