一尘不染

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

hibernate

我有一张带有自动增加的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值。

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


阅读 217

收藏
2020-06-20

共1个答案

一尘不染

您使用哪种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并进行一些内部检查以确定记录的唯一性

2020-06-20