@Column(columnDefinition)的使用

博客介绍了columnDefinition属性在数据库DDL中的使用。它可指定创建表时的SQL语句,如一次性指定varchar长度和非空约束,也能结合nullable和length属性实现相同效果。还能对String类型默认映射的varchar进行额外指定,以适应大文本需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

columnDefinition属性的使用:

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email",columnDefinition="varchar(128) not null")
    private String email;
    @Column(name = "Age")
    private int age;
    ......
}

数据库DDL:

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) NOT NULL,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

columnDefinition可以指定创建表时一些SQL语句,比如这里可以一次性指定,varchar长度128,且不能为空 
当然,相同的结果可以通过nullable和length属性结合实现

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email", nullable = true, length = 128)
    private String email;
    @Column(name = "Age")
    private int age;
    ......
}

数据库DDL:

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

columnDefinition属性的特殊使用:
编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型
但是String类型默认映射的数值类型是varchar,columnDefinition可以进行额外指定

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email", nullable = true, length = 128)
    private String email;
    @Column(name = "Age")
    private int age;
    @Column(name = "Remark",columnDefinition="text")
    private String remark;
    ......
}

数据库DDL:

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  `Remark` text,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

remark列数值类型是text,而Name和Email默认是varcahr

转载于:https://www.cnblogs.com/powerwu/articles/10564004.html

package indi.backend.repository.entity; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; import java.util.UUID; @Data @Builder @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "Users") public class Users { @Id @Column(columnDefinition = "uniqueidentifier") public UUID id; @Column(columnDefinition = "datetime2") public Date creationTime; @Column(columnDefinition = "nvarchar(max)") public String account; @Column(columnDefinition = "nvarchar(max)") public String password; @Column(columnDefinition = "bit") public Boolean enabled; @Column(columnDefinition = "datetime2") public Date lockStartTime; @Column(columnDefinition = "datetime2") public Date lockEndTime; @Column(columnDefinition = "nvarchar(max)") public String username; @Column(columnDefinition = "nvarchar(max)") public String avatar; @Column(columnDefinition = "nvarchar(max)") public String email; @Column(columnDefinition = "nvarchar(max)") public String phone; @Column(columnDefinition = "nvarchar(max)") public String sex; @Column(columnDefinition = "datetime2") public Date birthday; @Column(columnDefinition = "nvarchar(max)") public String address; @Column(columnDefinition = "datetime2") public Date lastActiveTime; @Column(columnDefinition = "int") public Integer permissionsLevel; @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) private TokenPool tokenPool; } package indi.backend.repository.entity; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; import java.util.UUID; @Data @Builder @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "TokenPool") public class TokenPool { @Id @Column(columnDefinition = "uniqueidentifier") public UUID id; @Column(columnDefinition = "datetime2") public Date creationTime; @Column(columnDefinition = "datetime2") public Date expiredTime; @Column(columnDefinition = "bit") public Boolean longTerm; @OneToOne @JoinColumn(name = "userId", nullable = false) private Users user; } 根据这两个实体优化public String login(String account, String password) { Users users = usersRepository.findByAccountAndPassword(account, cryptoUtil.sha256(password)).orElseThrow(() -> new RuntimeException("用户名或密码错误")); Date expiredTime = Date.from(LocalDateTime.now().plusSeconds(3600).atZone(ZoneId.systemDefault()).toInstant()); users.setLastActiveTime(expiredTime); usersRepository.save(users); TokenPool tokenPool = tokenPoolRepository.findByUserId(users.getId()).orElseGet(() -> TokenPool.builder().id(UUID.randomUUID()).creationTime(new Date()).longTerm(false).user(users).build()); tokenPool.setExpiredTime(expiredTime); tokenPoolRepository.save(tokenPool); return tokenPool.getId().toString(); } public void logout(String token) { if (token == null || token.isEmpty()) { throw new RuntimeException("没有传入token"); } TokenPool tokenPool = tokenPoolRepository.findById(UUID.fromString(token)).orElse(null); if (tokenPool != null) { usersRepository.findById(tokenPool.getUser().getId()).ifPresent(users -> { users.setLastActiveTime(new Date()); usersRepository.save(users); }); tokenPoolRepository.delete(tokenPool); } }不抽取方法
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值