【问题标题】:Hibernate annotation for mysql datatype SETmysql数据类型SET的休眠注释
【发布时间】:2014-05-30 07:12:38
【问题描述】:

我有一个MySQL 表,其中属性workingDaysdataType 是SET。像这样:

CREATE TABLE IF NOT EXISTS `course` (
`courseId` int(11) NOT NULL AUTO_INCREMENT,
`courseName` varchar(255) NOT NULL DEFAULT '0',
`courseDescription` varchar(255) DEFAULT NULL,
`courseDuration` int(11) DEFAULT NULL,
`courseBatchSize` int(11) NOT NULL DEFAULT '0',
`courseEnrolmentDate` date DEFAULT NULL,
`workingDays` set('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') DEFAULT NULL,
`courseFee` float DEFAULT NULL,
`isScholarshipAvailable` enum('Y','N') DEFAULT NULL,
`scholarshipCriteria` varchar(255) DEFAULT NULL,
`scholarshipExamDate` date DEFAULT NULL,
`successRate` tinyint(4) DEFAULT NULL,
`rating` tinyint(4) DEFAULT NULL,
`otherInfo` varchar(255) DEFAULT NULL,
`courseDiscount` float DEFAULT NULL,
`institute` int(11) DEFAULT NULL,
`exam` int(11) DEFAULT NULL,
PRIMARY KEY (`courseId`),
KEY `FK_INS` (`institute`),
KEY `FK_EX` (`exam`),
CONSTRAINT `FK_EX` FOREIGN KEY (`exam`) REFERENCES `exam` (`examId`),
CONSTRAINT `FK_INS` FOREIGN KEY (`institute`) REFERENCES `institute` (`instituteId`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 COMMENT='contains course info';

现在我想相应地使用jpa 注释映射pojo。目前我正在这样做

@Column(name = "workingDays", nullable = false, unique = false)
@Type(type="org.hibernate.type.settype")
private Set<String> workingDays;

注解@Column 来自javax.persistence 包。使用来自 hibernate 包的 @Type 注释我收到一个错误

    Caused by: java.lang.ClassNotFoundException: org.hibernate.type.settype

我的 pom.xml 文件添加了以下依赖项

    <!-- MySQL database driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.30</version>
    </dependency>

    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>1.1</version>
    </dependency>


    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0.2</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.5.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>4.0.4.Final</version>
    </dependency>

    <!-- Hibernate library dependecy start -->
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.3</version>
    </dependency>

    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>

    <dependency>
        <groupId>antlr</groupId>
        <artifactId>antlr</artifactId>
        <version>2.7.7</version>
    </dependency>
    <!-- Hibernate library dependecy end -->

我不确定如何解决此问题。映射到MySQL 数据库中的集合的任何见解或其他解决方法都会有所帮助。

编辑:还建议我是否可以在不使用 SET 的情况下将工作日属性存储在数据库中。此工作日属性适用于特定的公司类,我需要向最终用户显示该公司的工作日。关于数据类型的建议也会很有帮助。

谢谢。

【问题讨论】:

  • 是 org.hibernate.type.SetType 不是 org.hibernate.type.settype
  • 谢谢。但是,现在我收到此错误原因:org.hibernate.MappingException:无法实例化类型:org.hibernate.type.SetType 您能否提供一个如何使用此注释的示例?我对休眠很陌生

标签: java mysql spring hibernate jpa


【解决方案1】:

您不需要简单类型的@Type(type="org.hibernate.type.setType") 声明。您可以将其从字段声明中删除。

只有在使用高级自定义类型时才需要@Type 注释

class Account {

  @Type(type="com.something.type.CustomDateType")
  @Column(name = "OPEN_DATE")
  private CustomDate date;

}

【讨论】:

  • 那么如果我在mysql数据库中使用数据类型SET,要使用哪个注解,java端的数据类型应该是什么?
  • 您的问题中的数据库表结构不清楚。请用完整的结构更新它。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2018-01-28
相关资源
最近更新 更多