The databse returned no natively generated identity value问题

本文介绍了一个关于Hibernate框架中主键生成策略的具体案例,详细解释了如何定义News实体类及对应的映射文件,并通过测试类演示了在使用native生成策略时可能遇到的问题及其解决方案。

com.cqupt.dayday.model

代码

package com.cqupt.dayday.model;
import java.util.Date;

/**
 * Created by I am master on 2017/3/1.
 */

public class News {
    private Integer id;
    private String title;
    private String author;
    private Date date;

    public News(String title, String author, Date date) {
        this.title = title;
        this.author = author;
        this.date = date;
    }

    public News() {


    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "News{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", author='" + author + '\'' +
                ", date=" + date +
                '}';
    }
}

配置文件 News.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.cqupt.dayday.model.News" table="news">
        <id name="id" type="java.lang.Integer">
            <column name="id"/>
            <!--指定主键的生成方式, native:使用数据库本地方式-->
            <generator class="native"/>
        </id>
        <property name="title" type="java.lang.String">
            <column name="title"/>
        </property>
        <property name="author" type="java.lang.String">
            <column name="author"/>
        </property>
        <property name="date" type="java.util.Date">
            <column name="date"/>
        </property>
    </class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.cqupt.dayday.model.News" table="news">
        <id name="id" type="java.lang.Integer">
            <column name="id"/>
            <!--指定主键的生成方式, native:使用数据库本地方式-->
            <generator class="native"/>
        </id>
        <property name="title" type="java.lang.String">
            <column name="title"/>
        </property>
        <property name="author" type="java.lang.String">
            <column name="author"/>
        </property>
        <property name="date" type="java.util.Date">
            <column name="date"/>
        </property>
    </class>
</hibernate-mapping>

 

com.cqupt.dayday

测试类

package com.cqupt.dayday;

import com.cqupt.dayday.model.News;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;

import java.util.Date;

/**
 * Created by I am master on 2017/3/1.
 */
public class HibernateTest {
    @Test
    public void test()  {

        SessionFactory sessionFactory=null;

        Configuration configuration=new Configuration().configure();
          //最老的jar包需要这样写,用最新的jar包写会报错
//        ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
//                .applySettings(configuration.getProperties()).build();

        sessionFactory=configuration.buildSessionFactory();

        Session session=sessionFactory.openSession();

        Transaction transaction=session.beginTransaction();

        News news=new News();
        news.setAuthor("dayday");
        news.setDate(new Date());
        news.setTitle("java");

        System.out.println(news);
        System.out.println("-----"+session);

        session.save(news);

        transaction.commit();

        session.close();

        sessionFactory.close();
    }

}

遇到的问题

 

1)The databse returned no natively generated identity value

2)使用老式jar包

出错原因:

在指定主键生成策略的时候、配置了<generator class="native"/> 、这是提供自动增长、为数据表中的主键自动增长、但是如果数据库没有定义id列为自动增长的话、就会出现The database returned no natively generated identity value错误

解决方法:

在数据库中手动定义id列自动增长或在数据库中不手动建立该张数据表

转载于:https://www.cnblogs.com/Hdaydayup/p/6485197.html

<think>好的,我需要回答用户关于生成数据库的方法和教程的问题。首先,用户提到了几个引用,我需要仔细查看这些引用来提取有用的信息。 引用[1]提到在某个菜单里选择“Database—>generate database”来直接生成数据库,这可能是指使用特定的工具,比如PowerDesigner或者类似的数据库设计软件。用户可能需要具体的步骤指导,比如如何操作这些工具来生成数据库。 引用[2]讨论的是使用JetBrains IDEA的数据库工具生成Java Bean,这说明用户可能对从数据库表生成代码感兴趣。虽然这不是直接生成数据库,但可以作为补充信息,特别是如果用户需要将数据库结构与代码结合的话。 引用[3]提到用Java API生成ER图,这可能涉及到通过编程方式处理数据库结构,生成实体关系图。这对于需要自定义工具或者自动化流程的用户可能有帮助。 引用[4]详细描述了使用PowerDesigner生成MySQL数据库脚本的过程,并包含注释。这里提供了具体的SQL示例,用户可能需要知道如何配置模板以及生成带有注释的DDL语句。 接下来,我需要将这些信息整合成一个结构清晰的回答。首先介绍常用的生成数据库方法,分步骤说明,比如使用设计工具、IDE插件、脚本工具和编程实现。每个步骤需要结合引用中的具体内容,比如引用1和4提到的工具操作,引用2的IDE方法,引用3的编程方法。 然后,生成相关问题,这些问题需要围绕用户可能感兴趣的扩展内容,比如工具比较、脚本生成、注释添加、代码同步等,确保覆盖用户可能的后续疑问。 需要确保回答符合系统级指令,使用正确的中文和LaTeX格式,引用标识自然添加。同时,检查是否有遗漏的信息点,比如其他可能的生成方法或工具,但根据提供的引用,主要覆盖提到的工具和方法即可。 最后,确保回答结构清晰,步骤明确,用户能够按照指导进行操作,同时引用正确的位置,例如引用[1]和[4]对应工具使用,引用[2]对应IDE生成代码,引用[3]对应API生成ER图。</think>以下是为您整理的数据库生成方法指南,包含多种实现方式和工具推荐: ### 一、常用数据库生成方法 1. **可视化设计工具生成** - 使用PowerDesigner操作: 1. 完成概念模型设计后,选择菜单`Database->Generate Database` 2. 在生成窗口选择`Direct generation`模式直接生成数据库[^1] 3. 可自定义MySQL模板生成带注释的DDL语句,例如: ```sql create table WZ_ASSETS_PHOTO ( ID varchar(40) not null comment '图片编号', ASSETS_ID varchar(40) comment '资产编号', primary key (ID) ) comment '资产图片信息表';[^4] ``` 2. **IDE集成生成** - 在JetBrains IDEA中: 1. 连接数据库后,通过`Database工具窗口`右键表结构 2. 选择`Scripted Extensions->Generate POJOs`生成Java实体类[^2] 3. 可扩展实现数据访问层代码自动生成 3. **SQL脚本工具生成** - 使用Flyway/Liquibase: ```sql -- 示例迁移脚本 CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL ); ``` 4. **编程实现生成** - 使用Java DatabaseMetaData API: ```java DatabaseMetaData meta = connection.getMetaData(); ResultSet tables = meta.getTables(null, null, "%", new String[]{"TABLE"}); // 遍历结果集生成ER图数据[^3] ``` ### 二、方法对比 | 方法 | 适用场景 | 复杂度 | |---------------|--------------------------|--------| | 可视化工具 | 企业级数据库设计 | ★★☆ | | IDE集成 | 开发环境快速原型 | ★☆☆ | | 迁移工具 | 版本控制与持续集成 | ★★☆ | | 编程实现 | 自定义需求/特殊格式生成 | ★★★ |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值