Вставка нескольких записей в таблицу, содержащую @GeneratedValue, с помощью entityManager - PullRequest
0 голосов
/ 11 апреля 2019

Я новичок в спящем режиме и застрял с задачей вставки данных в таблицу SAMPLE, в которой есть автоматически сгенерированный столбец идентификаторов.

Я использую объект EntityManager для сохранения объекта в БД, однако получаю ошибку:

IllegalArgumentException в классе: SamplePk, метод установки свойства: id_sample

Ожидаемый тип: java.lang.Integer, фактическое значение: org.hibernate.id.IdentifierGeneratorHelper $ 2

Пожалуйста, найдите мой код ниже

Entity Class

@Entity(name="SAMPLE")
@IdClass(SamplePk.class)
@Table(name="TABLE_SAMPLE")
public class Sample{
    protected Integer id_sample;
        protected Integer test;
public Sample() {}

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id_sample")
    public Integer getId_sample() {
        return id_sample;
    }
    public void setId_gem_import(Integer id_sample) {
        this.id_sample= id_sample;
    }

        //remaining setter getter in place
}
SamplePK Class

public class SamplePK implements Serializable{
    private static final long serialVersionUID = 3688605897932153056L;
    protected Integer id_sample;
        protected Integer test;

    public SamplePK() {
    }
    public SamplePK(Integer id_sample) {
        super();
        this.id_sample= id_sample;
                this.test= test;

    }
    //setter getter in place
    //equals() , hashcode() and other constructor in place
}
persistence logic 

UserTransaction transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
transaction.begin();

//util class provides EntityManager 
ConnectionUtil conn = new ConnectionUtil(); 
EntityManager entityManager = conn.getEntityManager();

//objList is List object holding List of obj[]
//obj[] contains data for a row to be insert in SAMPLE Table : id_sample at 0, test at 1
ListIterator itr = objList.listIterator();
int index = 0;
while(itr.hasNext()) {
index++;
Object[] obj = (Object[])itr.next();

Sample objSample = new Sample();
objSample.setTest(obj[1]);

entityManager.persist(objSample );
if(index%batch_size==0) {  //batch_size is initialized to 50
    entityManager.flush();
    entityManager.clear();
    }
}
transaction.commit();

1 Ответ

1 голос
/ 12 апреля 2019

Попробуйте также пометить другие поля комбинированного ключа. Примерно так:

protected Integer id_sample;
protected Integer test;

@Id
@Column(name="id_sample")
public Integer getId_sample() {
    return id_sample;
}
public void setId_gem_import(Integer id_sample) {
    this.id_sample= id_sample;
}

@Id
@Column(name="test")
public Integer getTest() {
    return test;
}
public void setTest(Integer test) {
    this.test= test;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...