如果我在Spring Data JDBC中使用不带@Id的实体类,是否会丢失某些内容?

问题描述

我是春天的新手。

我刚刚尝试在Spring Data JDBC中成功使用不带@Id的实体类

自定义查询添加到我的存储库中,用于从2个MysqL表中检索数据并返回具有联接表数据的实体。

如果我仅打算使用自定义查询,那么我在这里遗漏了什么吗?

这是我的没有@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);
    }
}

我更新后的主要Configuration类是对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());
    }
}

解决方法

如果您没有任何例外,那应该没事。在未指定ID的情况下,Spring Data JDBC中不应有任何会静默破坏的内容。

问题出在哪里:我不认为这是可以正常工作的功能,而只是偶然的行为。这意味着它可能与任何版本都不兼容,尽管用基于NamedParameterJdbcTemplate的自定义实现替换这些方法并不难,所以风险有限。

但是问题是:在所有实体确实都有一个ID之后,为什么不添加@Id批注。而且,整个存储库的概念在概念上都需要一个id。

,

如果它正在运行,并且您真的不想使用注释,则可以这样做。但是我认为这是不必要的复杂性。如果使用了批注,可能会出现错误,并且代码将更难调试。如果您是Spring的新手,建议您使用批注。但是毕竟,这取决于您如何设计应用程序。为了确保没有注释的方法的优势,是可以更好地控制数据库。