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))

为什么将布尔值创建为非空而字符串/时间戳不是?如果您尝试插入没有电子邮件或密码的用户,我不会有例外,但是使用此生成的模式不会。是否有另一种方法可以强制 Hibernate 将该字段创建为不可为空?

4

1 回答 1

2

5.1.4.1.2 开始。访问类型

默认情况下,类层次结构的访问类型由 @Id 或 @EmbeddedId 注释的位置定义。如果这些注释在字段上,则仅考虑字段以进行持久性,并通过字段访问状态。如果 getter 上有注释,那么只有 getter 被认为是持久性的,并且通过 getter/setter 访问状态。

@Id当您在 getter 上进行注释时,您正在使用属性访问。因此,hibernate 将忽略字段上标记的所有映射注释,并且只使用 getter 上的注释来生成 DDL。因为在 getter 上没有注释,所以使用默认设置。

如果您更改为注释而不是,您应该得到您想要@IduserID结果getUserID()

于 2012-11-13T01:46:41.790 回答