JPA - 在persist()之后返回自动生成的id

时间:2012-03-16 05:36:50

标签: java jpa

我正在使用JPA(EclipseLink)和Spring。假设我有一个带有自动生成ID的简单实体:

@Entity
public class ABC implements Serializable {
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;

     // ...
}

在我的DAO类中,我有一个在此实体上调用persist()的insert方法。我希望该方法返回新实体的生成ID,但是当我测试它时,它会返回0

public class ABCDao {
    @PersistenceContext
    EntityManager em;

    @Transactional(readOnly=false)
    public int insertABC(ABC abc) {
         em.persist(abc);
         // I WANT TO RETURN THE AUTO-GENERATED ID OF abc
         // HOW CAN I DO IT?
         return abc.id; // ???
    }
}

我还有一个包装DAO的服务类,如果这有所不同:

public class ABCService {
    @Resource(name="ABCDao")
    ABCDao abcDao;

    public int addNewABC(ABC abc) {
         return abcDao.insertABC(abc);
    }
}

7 个答案:

答案 0 :(得分:151)

只保证在刷新时生成ID。持久化实体只会使其“附加”到持久化上下文。因此,要么明确地刷新实体管理器:

em.persist(abc);
em.flush();
return abc.getId();

或返回实体本身而不是其ID。当事务结束时,将发生刷新,因此事务外部的实体用户将在实体中看到生成的ID。

@Override
public ABC addNewABC(ABC abc) {
    abcDao.insertABC(abc);
    return abc;
}

答案 1 :(得分:10)

@Entity
public class ABC implements Serializable {
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;   
}

检查实体类中是否存在@GeneratedValue表示法。这告诉JPA您的实体属性自动生成的行为

答案 2 :(得分:3)

我就这样做了:

Map<*MyCodecInfoClass*, Codec>

答案 3 :(得分:2)

你也可以使用GenerationType.TABLE而不是IDENTITY,它只能在插入后使用。

答案 4 :(得分:0)

与4.0兼容的另一个选项:

在提交更改之前,您可以从与上下文关联的集合中恢复新的with open("C:\MXD\dataSources.csv") as csvfile: pathList = csvfile.readlines() vendMastList = ["Vendor", "vendor", "master", "Master"] for pth in pathList: for vendMast in vendMastList: if vendMast not in pth: print pth 对象,如下所示:

CayenneDataObject

然后访问集合中每个集合的CayenneDataObject dataObjectsCollection = (CayenneDataObject)cayenneContext.newObjects(); ,例如:

ObjectId

最后,您可以在这些值下进行迭代,其中通常generate_id将是ObjectId objectId = dataObject.getObjectId(); 返回的Map中的第一个值(对于单个列键),与PK关联的名称作为键:

getIdSnapshot()

答案 5 :(得分:0)

这就是我的方法。你可以尝试

    public class ABCService {
    @Resource(name="ABCDao")
    ABCDao abcDao;

    public int addNewABC(ABC abc) {
         ABC.setId(0);
         return abcDao.insertABC(abc);
    }
}

答案 6 :(得分:-2)

em.persist(abc);
em.refresh(abc);
return abc;