Использование Игры! платформа и это являются классом JPASupport, я столкнулся с проблемой с унаследованной базой данных.
У меня есть следующий класс:
@Entity
@Table(name="product_catalog")
public class ProductCatalog extends JPASupport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer product_catalog;
@OneToOne
@JoinColumn(name="upper_catalog")
public ProductCatalog upper_catalog;
public String name;
}
Некоторые каталоги продукции не имеют верхнего каталога, и на это ссылаются как 0 в унаследованной базе данных. Если я предоставляю upper_catalog как ПУСТОЙ УКАЗАТЕЛЬ, то как и следовало ожидать JPA вставляет Нулевое значение в тот столбец базы данных. Как я мог вынудить нулевые значения быть 0 при записи в базу данных и наоборот при чтении из базы данных?
Я не вижу простого способа достичь желаемого напрямую с помощью JPA (и есть большая вероятность, что даже если вы найдете способ, который работает с базовыми операциями, такими как сохранение или загрузка, он не будет работать с более сложными вариантами использования, такими как сложные критерии / hql, отсутствие стандартного режима выборки и т. д.)
Я бы сделал это:
@Entity
@Table(name="product_catalog")
public class ProductCatalog extends JPASupport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer product_catalog;
@Column(name="upper_catalog")
public Long upper_catalog_id;
public String name;
public ProductCatalog getUpperCatalog() {
if (upper_catalog_id == 0)
return null;
return ProductCatalog.findById(upper_catalog_id);
}
public void setUpperCatalog(ProductCatalog pc) {
if (pc == null) {
upper_catalog_id = 0;
}
else {
if (pc.id == null) {
// option 1. a bit like a cascade
pc.save();
// option 2. if you consider passing a transient entity is not valid
throw new RuntimeException("transient entity " + pc.toString());
}
upper_catalog_id = pc.id;
}
}
}
Я вижу два варианта:
Id
(т.е. int
вместо Integer
) CustomType
для преобразования