JPA - сгенерированный запрос для постоянного метода не вставляет все столбцы
Я довольно новичок в JPA, и у меня возникла проблема с персистентным методом менеджера сущностей для одной конкретной сущности. У меня есть таблица, подобная следующей:
CREATE TABLE Items
(
Id INTEGER NOT NULL,
GroupId INTEGER NOT NULL,
ItemId INTEGER NOT NULL,
Expires NUMBER(9,2)
)
Класс сущности выглядит примерно так:
@Entity
@Table(name = "Items")
public class Item {
@Id
@Column(name = "Id")
@GeneratedValue(generator = "item_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "item_seq", sequenceName = "ITEM_SEQ", allocationSize = 1)
private int id;
@Column(name = "GroupId")
private int groupId;
@Column(name = "ItemId")
private int itemId;
@Column(name = "Expires")
private int expires;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getGroupId() {
return groupId;
}
public void setGroupId(int groupId) {
this.groupId = groupId;
}
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public int getExpires() {
return expires;
}
public void setExpires(int expires) {
this.expires = expires;
}
}
В классе репозитория у меня есть следующее:
@Inject
private UserTransaction userTransaction;
...
userTransaction.begin()
Item item = new Item();
item.setItemId(itemId);
item.setGroupId(groupId);
em.persist(item);
userTransaction.commit()
Я получаю следующее исключение при попытке зафиксировать:
ORA-01400: невозможно вставить NULL в ("имя-схемы"."Items"."GroupId")
Проблема в том, что JPA генерирует следующий оператор вставки:
INSERT INTO Items (Id, ItemId) VALUES (?, ?)
Я не могу понять, почему JPA пропускает столбец GroupId. Я подтвердил, что groupId имеет допустимое значение, и я также попытался добавить inserttable = true к атрибуту Column. Как я уже говорил, это единственная сущность, где я вижу эту проблему. Я искал вокруг, но не нашел подобных проблем. Я использую Java EE 6, WebSphere и OpenJPA 2.2.3.
1 ответ
Эта проблема, скорее всего, связана с тем, что в объявлениях имен и именах таблиц смешаны регистры. Для меня Oracle (около 11,2, если я правильно помню...) всегда создает все имена таблиц и столбцов UPPERCASE. Ваш сценарий создания может фактически равняться:
CREATE TABLE ITEMS (
ID INTEGER NOT NULL,
GROUPID INTEGER NOT NULL,
ITEMID INTEGER NOT NULL,
EXPIRES NUMBER(9,2)
)
Вы можете форсировать свое собственное дело, обернув имена "
при создании таблиц, например:
CREATE TABLE "Items" ... -- and all the rest columns
Так что на самом деле вы можете иметь, например, таблицы Items
& ITEMS
в то же время. (У меня на самом деле была такая же проблема и с Postgres, который по умолчанию использует все имена в нижнем регистре).
В любом случае: сначала проверьте, действительно ли ваши поля находятся в базе данных.
Если ваша таблица действительно имеет имена столбцов, такие как GroupId
тогда вы можете попытаться "избежать" имени в аннотации с "
, лайк:
@Column(name = "\"GroupId\"")
Если они по умолчанию UPPERCASE, попробуйте соответственно:
@Column(name = "GROUPID")
Обратите внимание: это должно быть применено ко всем вашим полям с различным регистром.
Особенностью является то, что - по крайней мере для меня, и, похоже, также как и у вас с Oracle - что JPA, похоже, находит таблицу независимо от имени, но затем поиск столбцов не удался.
Большую часть времени лучше всего придерживаться по умолчанию, если для отклонений нет какой-то очень веской причины. Поэтому, когда бы мы ни работали с Oracle, мы использовали UPPERCASE везде.