【问题标题】:Hibernate's nullable = false not working in all casesHibernate 的 nullable = false 在所有情况下都不起作用
【发布时间】:2012-11-13 01:19:27
【问题描述】:

我有以下课程:

@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 将该字段创建为不可为空?

【问题讨论】:

    标签: java sql hibernate postgresql


    【解决方案1】:

    来自 5.1.4.1.2. Access type

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

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

    如果您更改为在userID 上注释@Id 而不是getUserID(),您应该会得到您想要的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2012-07-11
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多