当前位置: 首页 > 面试题库 >

当hibernate必须是表的主键时,如何使用休眠生成自定义ID

简滨海
2023-03-14
问题内容

这是我的pojo课

@Entity

public class Department {


@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="Department_Id")

private Integer deptId;


@Column(name="Department_Name",unique=true,nullable=false)
private String deptName;


@Column(name="Department_Description")
@NotNull
private String deptDesc;
   //geters and setters

我想要的是department_id必须是此Department表的主键,并且该键的条目必须为DEP0001,DEP0002,DEP0003


问题答案:

谢谢大家的回答……最后,我在Department类中做了一些更改,并使用了一个类来生成IDs ....这是我的代码

@Entity
public class Department {

@Id
@GenericGenerator(name = "sequence_dep_id", strategy = "com.xyz.ids.DepartmentIdGenerator")
@GeneratedValue(generator = "sequence_dep_id")  
@Column(name="Department_Id")
private String deptId;

@Column(name="Department_Name",unique=true,nullable=false)
private String deptName;


@Column(name="Department_Description")
@NotNull
private String deptDesc;

//getters and setters

DepartmentIdGenerator.java

package com.xyz.ids;

import java.io.Serializable;
import java.sql.*;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.IdentifierGenerator;

public class DepartmentIdGenerator implements IdentifierGenerator{

    @Override
    public Serializable generate(SessionImplementor session, Object object)
            throws HibernateException {

        String prefix = "DEP";
        Connection connection = session.connection();

        try {
            Statement statement=connection.createStatement();

            ResultSet rs=statement.executeQuery("select count(Department_Id) as Id from demo.Department");

            if(rs.next())
            {
                int id=rs.getInt(1)+101;
                String generatedId = prefix + new Integer(id).toString();
                System.out.println("Generated Id: " + generatedId);
                return generatedId;
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return null;
    }

}


 类似资料:
  • 问题内容: 嗨,我编写了这样的代码 但是我从DAO手动设置了它,例如“ e.setUserID(01);”。否则将不插入行是否有任何过程来获取ID值并检索自动生成的值。我想我会得到一些帮助 问题答案: 采用

  • 问题内容: 目标:我想在ImportJob中使用importJobId作为分配表ID的外键,这样,当我们那时具有importJobId时,那么我们只能在ID中分配ID,因为没有Job时就无法进行任何分配。 ImportJob表的复合主键为[ORGID,IMPORTJOBTYPE],正在尝试使用以下方式在休眠状态下创建外键关系: 在Allocation.hbm.xml中无法解决,并收到以下错误消息:

  • 问题内容: 我有一张带有自动增加的ID(每天刷新)的复合主键的表,并传递值。我正在将Hibernate用于数据库进程。我可以知道保存后如何立即检索自动增加的ID值吗?我试图获取ID,但是自动增加ID却没有显示任何价值。 码: 我尝试在保存如下表后获取ID值TableAPK id = dao.persist(session,entity); 或保存后添加刷新和刷新 但是我仍然无法检索tableAId

  • 问题内容: 我的实体如下。我的数据模型在下面强制执行,因此我无法更改引用的完整性。因此,我陷入了复合键的困境。我想自动生成/使用一些生成器作为orderId 是的,我已经阅读以下内容。 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity- mapping- identifier 我不想管理

  • 问题内容: hibernate如何生成外键约束名称? 如果我没有定义名称,hibernate将生成类似这样的内容 这个名字是怎么产生的?也许来自字段名称的哈希值或类似的东西?我需要知道所有实例上的名称是否相等。 问题答案: Hibernate通过串联表和属性名称来生成约束名称,并将结果转换为。由于某些数据库中的约束名称长度限制,因此需要它。例如,在Oracle数据库中,外键名称的长度不能超过30个

  • 问题内容: 是否可以在JPA / Hibernate中覆盖表名称,以便为所有项目实体添加通用前缀?例如,能够通过“ JBPM5_”前缀为所有JBPM 5表添加前缀。 可接受答案的示例: 问题答案: 一次重命名所有表的一种方法是实现自己的namingStrategy(的实现)。 使用的NamingStrategy在persistence.xml中由