【发布时间】:2016-04-11 12:31:42
【问题描述】:
我目前正在使用 Spring (Boot) 和 JPA 开发应用程序。我有以下两个实体:
@Entity
@AccessType(AccessType.Type.PROPERTY)
@Table(name = "T_ORDER")
public class Order {
@Id
private String id;
@Version
private Integer version = 0;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "order", cascade = CascadeType.ALL)
private List<Item> items = new ArrayList<>();
private String text;
private String status;
@Deprecated
public Order() {}
public static Order newOrder() {
Order order = new Order();
order.id = UUID.randomUUID().toString();
return order;
}
[... getters and setters ...]
[... equals and hashCode ...]
}
和
@Entity
@Table(name = "T_ITEM")
@IdClass(Item.ItemId.class)
public class Item {
public static class ItemId implements Serializable {
public String order;
public String id;
[... equals and hashcode ...]
}
@Id
@JsonIgnore
@ManyToOne(cascade = CascadeType.PERSIST)
private Order order;
@Id
private String id;
@Version
private int version = 0;
@Transient
private Product product;
private Integer productId;
private BigDecimal quantity;
private String quantityUnit;
private BigDecimal price;
[... getters and setters ...]
[... equals and hashcode ...]
}
我正在使用 CRUDRepository
@Repository
public interface OrderRepository extends CrudRepository<Order, String> {
@Transactional
List<Order> removeByStatus(String status);
}
在应用程序启动时插入数据
@Component
public class OrderLoader implements ApplicationListener<ContextRefreshedEvent> {
private final Logger logger = LoggerFactory.getLogger(getClass());
private OrderRepository orderRepository;
@Autowired
public void setOrderRepository(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
@Override
@Transactional(readOnly = false)
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
try {
Order order = Order.newOrder();
for (int itemId = 1; itemId < 3; itemId++) {
Item item = order.addItem();
item.setProductId(1);
}
order.setText("this is an order");
order.setStatus("delivered");
orderRepository.save(order);
} catch (Exception e) {
logger.error("This shit...", e);
}
}
}
使用 H2 控制台,我可以看到正在生成的表是空的。但是,在调用 orderRepository.save(order) 时,我得到了 DataIntegrityViolationException。
这对我来说似乎很奇怪:
- 表格是空的,
- 我使用 UUID 作为 ID 和
- 保存应合并具有相同键的两个实体。
完整的堆栈跟踪:http://pastebin.com/gYk2ZvP4
【问题讨论】:
标签: java spring hibernate jpa crud