java - 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

标签 java mysql jpa unsigned tinyint

我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean(使用 NetBeans IDE 8.0.1)。我在该表中遇到了一个类型为 "Unsigned TINYINT(3)" 的字段。我发现可以对 define the type of a column as an unsigned int 执行以下操作:

private long foo;

@Column(columnDefinition = "UNSIGNED INT(11)")
public long getFoo()
{
    return foo;
}

重现问题的步骤:

我正在尝试创建一个字段,如下所示:

@Size(max = 3)
@Column(name = "WorkingHours", columnDefinition="UNSIGNED TINYINT(3) default '40'")
private Integer workingHours;

问题:

我在将我的项目部署到我的服务器时收到以下错误:

{"JBAS014671: Failed services" => {"jboss.persistenceunit.\"my-project.ear/my-project-ejb.jar#old-db\"" => "org.jboss.msc.service.StartException in service jboss.persistenceunit.\"my-project.ear/my-project-ejb.jar#old-db\": javax.persistence.PersistenceException: Unable to execute JPA schema generation create command [create table ... etc.]
    Caused by: javax.persistence.PersistenceException: Unable to execute JPA schema generation create command [create table ... etc.]
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNSIGNED TINYINT(3), ... etc.' at line 1"}}

但是,如果我从我的 columnDefinition 中删除 "UNSIGNED"(所以该行变为 columnDefinition="TINYINT(3) default '40'") 我的项目部署成功。所以看起来 "UNSIGNED" 没有被识别。

所以我的问题是:如何将我的列(字段)定义为无符号 TINYINT?

更多细节:

我不确定它是否重要,但我的 persistence.xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="old-db" transaction-type="JTA">
    <jta-data-source>java:/jboss/datasources/mySQL_pool_old</jta-data-source>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
    </properties>
  </persistence-unit>
</persistence>

最佳答案

经过更多试验后,我找到了答案。

单词"UNSIGNED" 应该出现在"TINYINT" 之后而不是之前。该字段应定义如下:

@Size(max = 3)
@Column(name = "WorkingHours", columnDefinition="TINYINT(3) UNSIGNED default '40'")
private Integer workingHours;

我不确定这是为什么,我只是通过反复试验才发现的。也许其他人可以提供一个引用来解释为什么会这样。

关于java - 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26341084/

相关文章:

mysql - SQLSTATE[23000] : Integrity constraint violation: 1048 Column 'name' cannot be null (SQL: insert using Laravel 5. 1.*

mysql - 你如何在 mysql 中加入同一张表,两次?

java - 如何从MySQL表中删除所有数据并用新数据填充表

java - java.awt.image.BufferedImage 的二值化规则是什么

MySQL #1064 : declare a variable

带有元组表达式的子句中的 JPA 条件

java - 为什么我在 JPA 中使用 Oracle 的悲观锁定不起作用

mysql - JPA -表列引用作为两个不同表的外键

java - Android不幸的应用程序已停止?

java - 如何找到正确的用户名和密码标签?