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

时间:2015-06-02 09:40:33

标签: hibernate

我有1个表,其中包含来自自动增加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值。

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

1 个答案:

答案 0 :(得分:1)

您使用哪种Hibernate方法来坚持实体保存()坚持()? 如果您使用的是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基于ASSIGNMENT而不是基于GENERATION。因此,任何@GeneratedValue内容都不适用于它们。我的项目也有问题,我认为没有其他方法

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