如何从hibernate中的复合主键获取自动生成的值 [英] How to get auto generated value from composite primary key in hibernate

查看:134
本文介绍了如何从hibernate中的复合主键获取自动生成的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含自动增加ID(每天刷新)的复合主键的表并传入值。我正在使用Hibernate进行数据库处理。我可否知道如何在保存后立即检索自动增加的ID值?
我试图获得ID,但自动增加的ID只显示我没有价值。



代码:

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

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

$ b $ ......
}

@Embeddable
公共类TableAPK实现了Serializable {
/ * *
*
* /
private static final long serialVersionUID = -335299619303934505L;

private int tableAId;
私有字符串值;
$ b $ public TableAPK(){
}

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

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


public object persist(Session session,TableA entity )抛出SystemException {
Object id = null;
尝试{
id = session.save(entity);

......

return id;
}

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

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

trns.commit();
if(logger.isLoggable(Level.INFO)){
logger.info(Create New:ID:+ entity.getId()。getTransId()
+,创建时间:+ entity.getId()。getValue());
}

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

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

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

但我仍然无法检索tableAId值。 / p>

希望有人能为我提供一些建议。

解决方案

Hibernate是否使用持久实体 save() persist()
如果你使用persist(),那么 persist()永远不会将任何值返回给客户端,所以试试这个,

  long id = session.save(entity); 

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

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

......

return id;
}

你调用这个方法的地方 public void save (TableA实体)



试试这个,

  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是基于指配而非基于GENERATION的。因此,任何@GeneratedValue的东西都不应该与他们一起工作。我在我的项目中遇到了问题,我认为没有其他方法。如果您知道您的@GeneratedValue ID在您的域的上下文中始终是唯一的(例如,你的数据库),你不需要使用组合PK,并有一些内部检查来确定记录的唯一性。


I have 1 table with composite primary key from an auto-increase ID (refresh daily) and pass in value. I am using Hibernate for the DB process. May I know how can I retrieve the auto-increase ID value immediate after save? I tried to get ID, but the auto-increase ID just showing me no value.

Code:

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());
        }

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

I tried to get the ID value after save as below TableAPK id = dao.persist(session, entity); or add flush and refresh after save

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

but I still failed to retrieve the tableAId value.

Hope somebody can provide me some advice.

解决方案

Which method of Hibernate are you using to persist the entity save() or persist()? If you are using persist() then persist() will never give any value back to the client so Try This,

long id = session.save(entity);

If this is the method you are using to persist the entity

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

    ......

    return id;
}

form where you are calling this method public void save(TableA entity)

Try this,

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

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

I have been hovering over all the possible links on World Wide Websites and trying to find why you cannot use @GeneratedValue with @EmbeddedId or @IdClass (i.e. composite PKs). The reason is that you just CANNOT.

Composite PKs are ASSIGNMENT-based not GENERATION-based. Therefore, any @GeneratedValue stuff are not supposed to work with them. I am also having problem in my project and I think there is no other way

If you know that your @GeneratedValue ID is always unique in context of your domain (for example, your database) you don't need to use composite PK and have some internal checks to determine the uniqueness of your records

这篇关于如何从hibernate中的复合主键获取自动生成的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆