最近在看《Spring實戰》,看到第三章,使用了JPA。
在類定義上使用@Entity注解可以自動根據類的屬性創建類對應的表,并可方便地讀寫資料庫。
我使用的資料庫依賴項是H2 Database。
我想使用自定義Enum作為Entity類屬性,但在資料庫控制臺發現類中的Enum欄位在資料庫中對應欄位的型別是INT。如果我向資料庫中寫入的資料是String型別,由于String型別無法轉換為INT,寫入失敗。
我希望能向資料庫寫入Enum名字對應的String型別資料,而不是INT型別資料,該怎么做?
下面是代碼。
Ingredient.java
package tacos;
import javax.persistence.Entity;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
@Data
@RequiredArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
@Entity
public class Ingredient {
private final Type type;
public static enum Type {
WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
}
}
IngredientRepository.java
package tacos.data;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;
import tacos.Ingredient;
@NoRepositoryBean
public interface IngredientRepository
extends CrudRepository<Ingredient, String> {
Iterable<Ingredient> findAll();
@SuppressWarnings("unchecked")
Ingredient save(Ingredient ingredient);
}
JdbcIngredientRepository.java
package tacos.data;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import tacos.Ingredient;
import tacos.err.UnImplementError;
@Repository
public class JdbcIngredientRepository implements IngredientRepository {
private JdbcTemplate jdbc;
@Autowired
public JdbcIngredientRepository(JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
@Override
public Iterable<Ingredient> findAll() {
return jdbc.query("select id, name, type from Ingredient",
this:: mapRowToIngredient);
}
@SuppressWarnings("unchecked")
@Override
public Ingredient save(Ingredient ingredient) {
jdbc.update("insert into Ingredient (id, name, type) values(?, ?, ?)",
ingredient.getId(),
ingredient.getName(),
ingredient.getType().toString());
return ingredient;
}
private Ingredient mapRowToIngredient(ResultSet rs, int rowNum)
throws SQLException {
return new Ingredient(
rs.getString("id"),
rs.getString("name"),
Ingredient.Type.valueOf(rs.getString("type"))
);
}
@Override
public <S extends Ingredient> Iterable<S> saveAll(Iterable<S> entities) {
throw new UnImplementError();
}
@Override
public Optional<Ingredient> findById(String id) {
throw new UnImplementError();
}
@Override
public boolean existsById(String id) {
throw new UnImplementError();
}
@Override
public Iterable<Ingredient> findAllById(Iterable<String> ids) {
throw new UnImplementError();
}
@Override
public long count() {
throw new UnImplementError();
}
@Override
public void deleteById(String id) {
throw new UnImplementError();
}
@Override
public void delete(Ingredient entity) {
throw new UnImplementError();
}
@Override
public void deleteAll(Iterable<? extends Ingredient> entities) {
throw new UnImplementError();
}
@Override
public void deleteAll() {
throw new UnImplementError();
}
}
-----------更新:問題解決了-----------------
我們可以使用@Column注解Ingredient的type欄位。注解的columnDefinition的值可以寫該欄位在資料庫中的對應的欄位的資料定義(DDL)。下面是Ingredient.java修改后的部分。
package tacos;
import javax.persistence.Column;
@Entity
public class Ingredient {
@Column(columnDefinition = "varchar(255) not null")
private final Type type;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259608.html
標籤:Web 開發
上一篇:idea/spring boot單元測驗 不編譯整個專案
下一篇:推薦演算法學習
