对于这个特殊的问题,我找不到任何答案,这使我不得不再次猜测自己的体系结构。基本上我有两个实体,BaseCategoryEntity和ItemEntity。
@Entity
public class ItemEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID",unique = true,nullable = false)
private Long itemId;
@ManyToOne
@JoinColumn(name = "BCID",nullable = false)
private BaseCategoryEntity baseCategory;
@Column(name = "NAME",nullable = false)
private String name;
....
ItemEntity具有对应的DTO Item
。 ItemController
收到一个Item
,并将其传递给ItemService
,然后使用转换器将其保存到存储库中。
@Service
public class ItemService {
@Autowired
ItemRepository repository; //this is a CrudRepository
@Autowired
ItemConverter converter;
public void add(Item item){
repository.save(converter.convertFrom(item));
}
}
转换器看起来像这样
@Component
public class ItemConverter{
@Autowired
BaseCategoryConverter bcConverter;
public ItemEntity convertFrom(Item model) {
ItemEntity entity = new ItemEntity();
entity.setName(model.getName());
entity.setBaseCategory(bcConverter.convertFrom(model.getBaseCategoryName()));
return entity;
}
}
通过运行此代码,我得到 org.hibernate.TransientPropertyValueException:非null属性引用了一个瞬态值错误,因为未设置BaseCategoryEntity的ID。
解决此问题的最简单方法似乎是将ItemRepository
自动布线为ItemConverter
,将BaseCategoryRepository
自动布线为BaseCategoryConverter
,因此我可以将convertFrom
更改为首先检查如果实体已经存在并使用该实体,则创建并保存该实体(如果不存在)。
但是,转换器执行这种逻辑似乎不合适。