问题描述
我是春天的新手。
我刚刚尝试在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的新手,建议您使用批注。但是毕竟,这取决于您如何设计应用程序。为了确保没有注释的方法的优势,是可以更好地控制数据库。