1

spring と hibernate を使用して DB に新しいユーザーを保存しようとするたびに、この例外がポップアップし続けるのはなぜかと頭を悩ませています。

@Entity アノテーションが存在することを再確認し、@Table アノテーションを追加して、このオブジェクトがどのテーブルに属しているかを確認しましたが、まだこのエラーが発生しています

以下は私のユーザーオブジェクトです:

    @Entity
@Table(name = "USER")
public class User implements Serializable {

    /**
     * Serial version
     */
    private static final long serialVersionUID = 1L;

    @JsonElement(type = JsonElementType.JSON_KEY)
    public static final String KEY_BIO = "Bio";

    @JsonElement(type = JsonElementType.JSON_KEY)
    public static final String SURNAME = "Surname";

    @JsonElement(type = JsonElementType.JSON_KEY)
    public static final String KEY_FIRST_NAME = "FirstName";

    @JsonElement(type = JsonElementType.JSON_KEY)
    public static final String KEY_PASSWORD = "Password";

    @JsonElement(type = JsonElementType.JSON_KEY)
    public static final String KEY_EMAIL = "EmailAddress";

    @JsonElement(type = JsonElementType.JSON_KEY)
    public static final String KEY_USERNAME = "Username";

    @JsonElement(type = JsonElementType.JSON_KEY)
    public static final String KEY_USER_ID = "UserId";

    @JsonElement(type = JsonElementType.JSON_KEY)
    public static final int USERNAME_LENGTH = 5;

    @Id
    @Column(name = "USER_ID")
    @NotNull
    private String id;

    @Column(name = "USERNAME", nullable = false, unique = true)
    @NotNull
    private String username;

    @Column(name = "EMAIL_ADDRESS", nullable = false, unique = true)
    @NotNull
    private String emailAddress;

    @Column(name = "PASSWORD")
    @NotNull
    @Size(min = 5, max = 25)
    private String password;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "SURNAME")
    private String surname;

    @Column(name = "COUNTRY")
    private String country;

    @Column(name = "BIO")
    private String bio;



    @Column(name = "SESSION_ID")
    private String sessionId;

    @Column(name = "LAST_REST_CALL_MADE")
    private Date lastRestCallMade;

    @Column(name = "STATUS")
    @NotNull
    private int status;

    @OneToOne
    @JoinColumn(name = "imageId")
    private ProfileImage profileImage;

    public User() {
        id = UUID.randomUUID().toString();
    }

    @JsonElement(type = JsonElementType.GETTER)
    public ProfileImage getProfileImage() {
        return profileImage;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setProfileImage(ProfileImage profileImage) {
        this.profileImage = profileImage;
    }

    @JsonElement(type = JsonElementType.GETTER)
    public String getId() {
        return id;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setId(String id) {
        this.id = id;
    }

    @JsonElement(type = JsonElementType.GETTER)
    public String getUsername() {
        return username;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setUsername(String username) {
        this.username = username;
    }

    @JsonElement(type = JsonElementType.GETTER)
    public String getEmailAddress() {
        return emailAddress;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    @JsonElement(type = JsonElementType.GETTER)
    public String getPassword() {
        return password;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setPassword(String password) {
        this.password = password;
    }

    @JsonElement(type = JsonElementType.GETTER)
    public String getFirstName() {
        return firstName;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @JsonElement(type = JsonElementType.GETTER)
    public String getSurname() {
        return surname;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setSurname(String surname) {
        this.surname = surname;
    }

    @JsonElement(type = JsonElementType.GETTER)
    public String getBio() {
        return bio;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setBio(String bio) {
        this.bio = bio;
    }

    @JsonElement(type = JsonElementType.GETTER)
    public String getCountry() {
        return country;
    }

    @JsonElement(type = JsonElementType.SETTER)
    public void setCountry(String country) {
        this.country = country;
    }

    /**
     * @return the sessionId
     */
    public String getSessionId() {
        return sessionId;
    }

    /**
     * @param sessionId the sessionId to set
     */
    @JsonElement(type = JsonElementType.SETTER)
    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }

    /**
     * @return the lastRestCallMade
     */
    public Date getLastRestCallMade() {
        return lastRestCallMade;
    }

    /**
     * @param lastRestCallMade the lastRestCallMade to set
     */
    public void setLastRestCallMade(Date lastRestCallMade) {
        this.lastRestCallMade = lastRestCallMade;
    }

    /**
     * @return the status
     */
    public int getStatus() {
        return status;
    }

    /**
     * @param status the status to set
     */
    public void setStatus(int status) {
        this.status = status;
    }

}

これが私のuserDaoの機能です

@Override
    public void addNewUser(User user) throws InvalidDataException {
        // TODO: Add Transaction manager object here either using annototation
        // or creating it programatically

        if (mSessionFactory != null) {
            session = mSessionFactory.getCurrentSession();
            session.beginTransaction();
            if (user.getUsername() == null
                    || user.getUsername().length() < User.USERNAME_LENGTH) {
                throw new InvalidDataException(
                        InvalidDataException.ERROR_USERNAME_NULL);
            }

            session.save(user);

        }else{
            throw new RuntimeException("mSession is null");
        }
    }

ここでは非常に簡単です。

以下の完全なストラックトレース:

org.hibernate.MappingException: Unknown entity: com.jr.freedom.user.User
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1092)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1399)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:753)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:745)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:741)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
    at $Proxy20.save(Unknown Source)
    at com.jr.freedom.dao.UserDao.addNewUser(UserDao.java:50)
    at com.jr.freedom.user.UserService.registerNewUser(UserService.java:47)
    at com.jr.freedom.controllers.UserController.createNewAccount(UserController.java:57)
    at com.test.jr.freedom.controllers.UserControllerTest.testCreateNewAccount(UserControllerTest.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

session.save(user); を呼び出すとクラッシュします。

4

4 に答える 4

2

ビンゴ。sessionFactory を構成する xml 構成ファイルにある問題は次のとおりです。

<property name="annotatedClasses">
            <list>
                <value>com.jr.freedom.user.User</value>
                <value>com.jr.freedom.user.ProfileImage</value>
            </list>
        </property>

以下のこのBeanにはそれがありませんでした:

<bean id="mySessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="configLocation" value="hibernate.cfg.xml" />
        <property name="annotatedClasses">
            <list>
                <value>com.jr.freedom.user.User</value>
                <value>com.jr.freedom.user.ProfileImage</value>
            </list>
        </property>

    </bean>

それで私はそれを追加しました、そしてそれはうまくいきました!問題は、100 個のエンティティを維持して使用する必要がある場合はどうすればよいかということです。この sessionFactory 内に annotatedClasses 値の長いリストを作成するのは面倒です! spring または hibernate に「選択したパッケージをスキャンして、エンティティでマークされたオブジェクトを見つけて使用してください」と言う方法を教えてください。

于 2013-03-20T16:33:11.190 に答える
0

JPAプロバイダーにjarをスキャンするように指示できますが、その場合は、すべてのエンティティークラスを別のjarにパッケージ化する必要があります。その他の解決策は、プロバイダー固有のハックです。私はグーグルリフレクションを使用してアノテーションをスキャンし、HibernateのEjbConfigurationクラスを使用してすべてのエンティティアノテーション付きクラスを登録することでそれを行いました。ただし、これはHibernate 4ではすでに非推奨であり、Hibernate5では廃止される予定です。

于 2013-03-20T17:37:53.447 に答える
0

hbm.xml を cfg.xml ファイルに追加するのを忘れていました。追加するとすぐに、この例外は消えました。

<mapping resource="com/swipex/backend/hibernate/CServiceCenters.hbm.xml" />
于 2014-10-07T04:24:33.333 に答える
0

回答に投稿した質問に回答します。
Entity Manager を使用して、休止状態のエンティティを自動検出できます。

class 要素は、マップする完全修飾クラス名を指定します。デフォルトでは、適切に注釈が付けられたすべてのクラスと、アーカイブ内にあるすべての hbm.xml ファイルが永続ユニット構成に追加されます。ただし、クラス要素を介して外部エンティティを追加できます

. http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html

于 2013-03-20T16:59:34.277 に答える