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

如何从休眠中的复合主键获取自动生成的值

欧阳正德
2023-03-14
问题内容

我有一张带有自动增加的ID(每天刷新)的复合主键的表,并传递值。我正在将Hibernate用于数据库进程。我可以知道保存后如何立即检索自动增加的ID值吗?我试图获取ID,但是自动增加ID却没有显示任何价值。

码:

public class TableA implements Serializable {
    private static final long serialVersionUID = 1L;
    private TableAPK id;

    @Id
    @EmbeddedId
    public TableAPK getId() {
        return this.id;
    }

    ......
}

@Embeddable
public class TableAPK implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -335299619303934505L;

    private int tableAId;
    private String value;

    public TableAPK() {
    }

    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getTableAId() {
        return this.tableAId;
    }

    ...........
}


public Object persist(Session session, TableA entity) throws SystemException {
    Object id = null;
    try {
        id = session.save(entity);

    ......

    return id;
}

public void save(TableA entity) throws SystemException {
    Transaction trns = null;
    Session session = null;
    try {
        session = SessionUtil.getSessionFactory().openSession();
        trns = session.beginTransaction();

        DaoInterface<TableA> dao = new TableADaoImpl();
        dao.persist(session, entity);

        trns.commit();
        if (logger.isLoggable(Level.INFO)) {
            logger.info("Create New: ID: " + entity.getId().getTransId()
                    + ", Created time: " + entity.getId().getValue());
        }

    ...............
}

我尝试在保存如下表后获取ID值TableAPK id = dao.persist(session,entity); 或保存后添加刷新和刷新

dao.persist(session, entity);
session.flush;
session.refresh(entity)

但是我仍然无法检索tableAId值。

希望有人能给我一些建议。


问题答案:

您使用哪种Hibernate方法来 持久 化实体 save()persist() ?如果您使用persist(),那么
persist()将永远不会 给客户端任何价值,因此请尝试一下,

long id = session.save(entity);

如果这是您用来保留实体的方法

public Long persist(Session session, TableA entity) throws SystemException {
    Long id = null;
    try {
        id = session.save(entity);

    ......

    return id;
}

您在其中调用此方法的表单 public void save(TableA entity)

尝试这个,

TableAPK tableAPK=new TableAPK();
tableAPK.setTableAId(....);
tableAPK.setValue(....);

TableA tableA=new TableA();
tableA.setId(tableAPK);
Object compositeId=session.save(tableA);

我一直将鼠标悬停在万维网站点上的所有可能链接上,试图找到为什么不能将@GeneratedValue与@EmbeddedId或@IdClass(即复合PK)一起使用的原因。原因是您不能。

复合PK基于分配而不是基于生成。因此,任何@GeneratedValue东西都不应该与它们一起使用。我的项目也有问题,我认为别无选择

如果您知道@GeneratedValue ID在域(例如数据库)的上下文中始终是唯一的,则无需使用复合PK并进行一些内部检查以确定记录的唯一性



 类似资料:
  • 本文向大家介绍如何获取自动生成的(主)键值?相关面试题,主要包含被问及如何获取自动生成的(主)键值?时的应答技巧和注意事项,需要的朋友参考一下 insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。 如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入 的参数对象中。 示例:

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

  • 我想创建一个复合主键,其中一个字段是自动生成的(JPA)。我能这么做吗?有没有可能从spring环境中得到一个生成器? null

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

  • 问题内容: 我使用Hibernate制作了一个示例应用程序。我的要求是表上没有主键。我只需要从应用程序中选择查询。我知道应该有一个主键,但是我所引用的表没有它。 它有大约5万条记录。因此,修改表以添加ID列将看不到可行的选项。 有可能吗 问题答案: Hibernate 要求 实体表具有主键。故事结局。 在谈论数据库时,5万条记录根本就不多。 我的建议:在表中添加一个自动增量整数PK列。您会对它的速

  • 问题内容: 我想知道什么是从hibernate查询中获取地图数组的最佳方法。Google表示要迭代query.list(),然后将对象创建/放入空地图数组。 我想会有一些优雅而有效的方法来做到这一点。有人可以给我个主意吗? 问题答案: 参见Hibernate文档-15.6。select子句: 您可以使用以下方式为选定的表达式分配别名: 与选择新地图一起使用时,这非常有用: 该查询返回一个从别名到所