У меня есть модель, которую я не хочу вставлять вручную или автоматически, @Id, я просто хочу записать ее из вставки? Java - PullRequest
0 голосов
/ 02 апреля 2020
@Id
@Column(name="ROWID", insertable=false)
private String rowId;
@Column(name="CLIENT_ID")
private Integer clientId;
@Column(name="ACCT_NO")
private String acctNo;
@Column(name="ACCT_CIF_NO")
private String acctCifNo;
@Column(name="ACCT_TYPE")
private String acctType;
@Column(name="ACCT_CUR")
private String acctCur;
@Column(name="ACCT_STATUS")
private Integer acctStatus;
@Column(name="ACCT_MAX_TRX_AMOUNT")
private Long acctMaxTrxAmount;
@Column(name="ACCT_MAX_TRX_DAILY")
private Long acctMaxTrxDaily;
@Column(name="ACCT_NAME")
private String acctName;
@Column(name="CTL_CREATE_DTM")
private Date ctlCreateDtm;
@Column(name="CTL_CREATE_BY")
private String ctlCreateBy;
@Column(name="CTL_UPDATE_DTM")
private Date ctlUpdateDtm;
@Column(name="CTL_UPDATE_BY")
private String ctlUpdateBy;

У меня есть модель, и я хочу использовать репозиторий jpa для вставки. Используйте эту модель, но я не хочу вставлять rowId, поскольку он генерируется из базы данных Oracle, поэтому я хочу пропустить его, возможно?

служба такая же, как эта

@Override
public TEmasUsers create(TEmasUsers entity) {
    return emasUsersDao.save(entity);
}

таблица из базы данных и без rowid на ней

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long rowId;
0 голосов
/ 02 апреля 2020

GenerationType.IDENTITY - самый простой способ достичь этого. IDENTITY указывает, что столбцы IDENTITY базы данных будут использоваться для генерации значения первичного ключа.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ROWID")
private String rowId;

Но это не единственное изменение, которое вам может понадобиться. Ваш столбец ROWID должен быть своего рода автоинкрементным в вашей базе данных.

В Oracle IDENTITY поддерживается с версия 12 c и выглядит следующим образом:

CREATE TABLE t1 (
    c1 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, // this line
    c2 VARCHAR2(10)
);

Итак, я бы также изменил private String rowId; на private Long rowId;, если вы хотите, чтобы это работало с Oracle DB, и только после этого при сохранении автоматически сгенерированное значение будет вставлено в этот столбец.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ROWID")
private Long rowId;

Некоторые детали отсутствуют, поэтому давайте представим, что у вас есть хранилище:

public interface SomeRepository extends CrudRepository<YourEntity, String> {}

Если вы хотите сохранить что-то в БД, вы должны сделать что-то вроде этого:

...
YourEntity entity = new YourEntity();
// YOU DON'T SET rowId ! Remain it null
entity.setClientId(123);
entity.setAcctNo("123456");

// set all the other fields
...

И в каком-то месте вы бы позвонили:

...    
YourEntity persisted = someRepository.save(entity);
...

Как только вы сохранитесь, у этого persisted будет rowId (в общем случае поле с аннотацией @Id) не null, но с некоторым значением, которое генерируется и устанавливается в это поле.

0 голосов
/ 02 апреля 2020

Попробуйте добавить @GeneratedValue в столбец rowId

@Id
@Column(name="ROWID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String rowId; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...