如果我在 Spring 数据 JDBC 中使用没有 @Id 的实体 class,我是否遗漏了什么?
Am I missing something if I use my entity class without @Id in Spring Data JDBC?
我是 spring 的新手。
我刚刚尝试在 Spring 数据 JDBC
中使用没有 @Id 的实体 class 成功
在我的存储库中添加了自定义查询,用于从 2 mysql table 中检索数据并返回具有连接的 table 数据的实体。
如果我打算只使用自定义查询,我是否遗漏了什么?
这是我的实体 class,没有 @Id 或 @Entity:
public class Item
{
private long id;
private String code;
private String itemName;
private String groupName;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
}
存储库层:
@Repository
public interface ItemRepository extends PagingAndSortingRepository<Item, Long>
{
@Query("SELECT a.id, a.code, a.name AS item_name,
b.name as group_name from item a, item_group b
WHERE a.group_id = b.id AND a.id=:id")
Item findItemById(@Param("id") Long id);
}
服务层:
@Service
public class ItemServiceImpl implements ItemService
{
private final ItemRepository itemRepository;
public ItemServiceImpl(ItemRepository itemRepository)
{
this.itemRepository = itemRepository;
}
@Override
@Transactional(readOnly=true)
public Item findItemById(Long id)
{
return itemRepository.findItemById(id);
}
}
我更新了主配置 class 以响应 Jens 的回答:
@SpringBootApplication
@EnableJdbcRepositories
public class SpringDataJdbcApplication extends AbstractJdbcConfiguration
{
public static void main(String[] args)
{
SpringApplication.run(SpringDataJdbcApplication.class, args);
}
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource()
{
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
return dataSourceBuilder.build();
}
@Bean
NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource)
{
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
PlatformTransactionManager transactionManager()
{
return new DataSourceTransactionManager(dataSource());
}
}
如果您没有遇到任何异常,您应该没问题。 Spring 数据 JDBC 中不应该有任何在未指定 id 时静默中断的内容。
但问题是:我不认为这是一个有效的功能,而只是偶然的行为。这意味着它可能会破坏任何版本,尽管用基于 NamedParameterJdbcTemplate
的自定义实现替换这些方法应该不会太难,因此风险有限。
但问题是:你为什么不添加 @Id
注释,毕竟你的实体确实有一个 ID。存储库的整个概念在概念上需要一个 id。
如果它工作正常并且您真的不想使用注释,则可以这样做。但我认为这是不必要的并发症。如果您使用了注释,您可以预料到不会出现的错误,并且代码将更难调试。如果您是 Spring 的新手,我建议您使用注释。但毕竟这取决于您将如何设计您的应用程序。当然,没有注释的方法的优势是对数据库的更好控制。
我是 spring 的新手。
我刚刚尝试在 Spring 数据 JDBC
中使用没有 @Id 的实体 class 成功在我的存储库中添加了自定义查询,用于从 2 mysql table 中检索数据并返回具有连接的 table 数据的实体。
如果我打算只使用自定义查询,我是否遗漏了什么?
这是我的实体 class,没有 @Id 或 @Entity:
public class Item
{
private long id;
private String code;
private String itemName;
private String groupName;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
}
存储库层:
@Repository
public interface ItemRepository extends PagingAndSortingRepository<Item, Long>
{
@Query("SELECT a.id, a.code, a.name AS item_name,
b.name as group_name from item a, item_group b
WHERE a.group_id = b.id AND a.id=:id")
Item findItemById(@Param("id") Long id);
}
服务层:
@Service
public class ItemServiceImpl implements ItemService
{
private final ItemRepository itemRepository;
public ItemServiceImpl(ItemRepository itemRepository)
{
this.itemRepository = itemRepository;
}
@Override
@Transactional(readOnly=true)
public Item findItemById(Long id)
{
return itemRepository.findItemById(id);
}
}
我更新了主配置 class 以响应 Jens 的回答:
@SpringBootApplication
@EnableJdbcRepositories
public class SpringDataJdbcApplication extends AbstractJdbcConfiguration
{
public static void main(String[] args)
{
SpringApplication.run(SpringDataJdbcApplication.class, args);
}
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource()
{
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
return dataSourceBuilder.build();
}
@Bean
NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource)
{
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
PlatformTransactionManager transactionManager()
{
return new DataSourceTransactionManager(dataSource());
}
}
如果您没有遇到任何异常,您应该没问题。 Spring 数据 JDBC 中不应该有任何在未指定 id 时静默中断的内容。
但问题是:我不认为这是一个有效的功能,而只是偶然的行为。这意味着它可能会破坏任何版本,尽管用基于 NamedParameterJdbcTemplate
的自定义实现替换这些方法应该不会太难,因此风险有限。
但问题是:你为什么不添加 @Id
注释,毕竟你的实体确实有一个 ID。存储库的整个概念在概念上需要一个 id。
如果它工作正常并且您真的不想使用注释,则可以这样做。但我认为这是不必要的并发症。如果您使用了注释,您可以预料到不会出现的错误,并且代码将更难调试。如果您是 Spring 的新手,我建议您使用注释。但毕竟这取决于您将如何设计您的应用程序。当然,没有注释的方法的优势是对数据库的更好控制。