2

私は次のクラスを持っています:

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

    private Long userID;

    @Id
    @Column(name = "userID")
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name = "increment", strategy = "increment")
    public Long getUserID() {
        return userID;
    }

    @Column(nullable = false)
    private boolean isActive;

    @Column(nullable = false, unique = true)
    private String email;

    @Column(nullable = false)
    private String password;


    @Column
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar lastLoggedIn;

    @Column(nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar createdDate;

    @Version
    private Integer version;

    public String getEmail() {
        return email;
    }

    public boolean isActive() {
        return isActive;
    }

    public void setActive(boolean isActive) {
        this.isActive = isActive;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Calendar getLastLoggedIn() {
        return lastLoggedIn;
    }

    public void setLastLoggedIn(Calendar lastLoggedIn) {
        this.lastLoggedIn = lastLoggedIn;
    }

    public Calendar getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Calendar createdDate) {
        this.createdDate = createdDate;
    }

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }

    public void setUserID(Long userID) {
        this.userID = userID;
    }

    public User(Long userID, String email, String password, Calendar lastLoggedIn, Calendar createdDate, Integer version) {

    }

    // No argument constructor
    public User() {}
}

アプリケーションを実行すると、Hibernate は構成をロードし、ユーザーのテーブルを作成します。Postgresql を使用しています。これは、生成される SQL ステートメントです (hibernate によってログに記録されます)。

Hibernate: create table USERS 
           (userID int8 not null, active boolean not null, createdDate timestamp, 
            email varchar(255), lastLoggedIn timestamp, 
            password varchar(255), version int4, primary key (userID))

ブール値が非 null として作成され、文字列/タイムスタンプがそうでないのはなぜですか? 電子メールまたはパスワードなしでユーザーを挿入しようとしても例外はありませんが、この生成されたスキーマではそうではありません。Hibernate に null 不可としてフィールドを作成させる別の方法はありますか?

4

1 に答える 1

2

5.1.4.1.2から。アクセスの種類:

デフォルトでは、クラス階層のアクセス タイプは @Id または @EmbeddedId アノテーションの位置によって定義されます。これらの注釈がフィールドにある場合、フィールドのみが永続化対象と見なされ、状態はフィールドを介してアクセスされます。注釈が getter にある場合、getter のみが永続性と見なされ、状態は getter/setter を介してアクセスされます。

getter に注釈を付ける@Idと、プロパティ アクセスが使用されます。そのため、hibernate はフィールドにマークされたすべてのマッピング アノテーションを無視し、getter のアノテーションのみを使用して DDL を生成します。getter には注釈がないため、デフォルト設定が使用されます。

@IduserID代わりにに注釈を付けるように変更すると、目的の結果が得られるはずですgetUserID()

于 2012-11-13T01:46:41.790 に答える