【问题标题】:How to get auto generated Id after persist into the mysqlDB Using JPA使用JPA持久化到mysqlDB后如何获取自动生成的ID
【发布时间】:2016-06-13 07:33:20
【问题描述】:

这里我尝试在mysql db中保存数据后获取自动生成的ID。

DTO 类

public class TradeTransaction {

    private long tradetransactionid ;
    private long borrowerid ;
    private String operationalcountry ;
    private String productcategory ;
    private String producttype ;
    private boolean ishazardous;
    private boolean specialisedHandle;
    private String currency;
    private double transactionvalue;
    private String suppliercountry;

    @Id
    @Column
    public long getTradetransactionid() {
        return tradetransactionid;
    }
    @Column
    public long getBorrowerid() {
        return borrowerid;
    }

业务逻辑类持久化到数据库中。

        EntityManager v_objEm;
        EntityTransaction v_objTran;
        TradeTransaction v_ObjectToPersist;
        v_ObjectToPersist = new TradeTransaction();

        v_ObjectToPersist.setBorrowerid(25);
        v_ObjectToPersist.setOperationalcountry("India");
        v_ObjectToPersist.setProductcategory("electornics");
        v_ObjectToPersist.setProducttype("E9088"));
        v_ObjectToPersist.setIshazardous(true);
        v_ObjectToPersist.setSpecialisedHandle(true);
        v_ObjectToPersist.setCurrency("usd");
        v_ObjectToPersist.setTransactionvalue(2000.3);
        v_ObjectToPersist.setSuppliercountry("african-based");
        v_objEm = MyCustomClass.getEntityManager();
        v_objTran = v_objEm.getTransaction();
        v_objTran.begin();

        v_objEm.persist(v_ObjectToPersist);
        System.out.println(v_ObjectToPersist.getTradetransactionid()); //Transaction ID print as Zero.
        v_objTran.commit(); 
        System.out.println(v_ObjectToPersist.getTradetransactionid()); //Transaction ID print as Zero Here Too.

        //v_objEm.refresh(v_ObjectToPersist);  //not Working throwing Exception.
        v_objEm.close();

我尝试了不同风格的代码来从Object 获取自动生成的 ID,该 ID 只是持久化到数据库中。但没有成功。

注意:- 此代码工作正常,并将数据保存到 db (无错误)。但是将无法获得自动生成的 ID(这是一个 primary key 在表中有多个引用)。 到目前为止我尝试过的链接

  1. jpa-returning-an-auto-generated-id-after-persist

  2. how-to-get-id-of-last-persisted-entity-using-jpa

  3. how-to-get-the-primary-key-of-any-jpa-entity

请帮帮我..任何帮助都会被应用..

谢谢。

【问题讨论】:

    标签: java mysql spring hibernate jpa


    【解决方案1】:

    这是一个长镜头,但无论如何我都会建议。

    您已经声明了字段private long tradetransactionid;,它是一个原始类型。这意味着它不允许空值,并且在实例化时隐式为 0。当您将对象持久保存在数据库中时,您会尝试插入一个 id 等于 0 的项目/对象。 你可以试试private Long tradetransactionid;,它是一个引用类型。这样一开始它是空的,可以通过自动生成来设置。

    【讨论】:

    • 它对我来说很好用。数据将能够持久保存到数据库中。请仔细阅读问题。我已经提到了谢谢你
    • 我了解数据能够持久化。但也许数据库中的 id 是自动生成的,而不是用 0 覆盖。这并不意味着 JPA 将覆盖 java 对象中的 id 值,如果它已经设置。
    【解决方案2】:

    要使用 MySQL AUTO_INCREMENT,您需要将您的 PK 字段标记为

    @GeneratedValue(strategy=GenerationType.IDENTITY)
    

    而你没有。没有那个 JPA 将不知道该 id 已在数据存储中分配

    【讨论】:

      【解决方案3】:
      entityManager.persist(model);
      model.getTradetransactionid();
      

      然后尝试..

       entityManager.flush();
      

      【讨论】:

      • 请您编辑您的答案并编写完整的代码。因为我已经尝试过您建议的方式但无法成功获取ID。谢谢@JasonChrist
      【解决方案4】:

      要使用 MySQL 自动生成的 id,您需要将主键标记为

      @GeneratedValue(strategy=GenerationType.AUTO)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 2021-02-25
        • 2012-04-19
        • 2018-06-22
        • 2011-12-28
        • 2013-07-25
        相关资源
        最近更新 更多