2016-04-11 20 views
0

kullanarak aynı tanımlayıcı Şu anda Spring (Boot) ve JPA ile bir uygulama geliştiriyorum.DataIntegrityViolationException: CRUDRepository

@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 ...] 
} 

ve

@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 ...] 
} 

Ben H2 Kullanma uygulama başlatma

@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); 
     } 
    } 
} 

verileri eklemek için bir CRUDRepository

@Repository 
public interface OrderRepository extends CrudRepository<Order, String> { 
    @Transactional 
    List<Order> removeByStatus(String status); 
} 

kullanıyorum: Ben şu İki varlık vardır konsol, bunu görebiliyorum tablolar üretiliyor ve boş. Ancak, orderRepository.save (sipariş) çağırırken DataIntegrityViolationException alıyorum.

  1. tabloları boş,
  2. Ben kimlikleri UUIDs kullanıyorum ve
  3. aynı anahtarla iki şirketin birleştirilmesine gerektiğini kaydedin:

    Bu şekilde bana çok garip geliyor.

tam StackTrace: saveAndFlush değişiklikler hemen DB kızarmış olacak birlikte yapılır flush veya commit kadar veritabanına geçerli olmayacaktır sadece save değişiklikleri kullanırken http://pastebin.com/gYk2ZvP4

cevap

0

deneyin, orderRepository.save(order); yerine orderRepository.saveAndFlush(order); kullanmak .

+0

Bu bir CRUDRepository olduğundan, flush() veya saveAndFlush() yöntemlerine sahip değildir. Onu bir JPARepository olarak değiştirmeye çalıştım ve söz konusu yöntemleri kullandım, ancak İstisna aynı kalıyor. –

+0

@ 3vIL_VIrUs Doğru veritabanını kontrol ettiğinizden emin misiniz? –

+0

Sadece bir tane uygulama için kullanılabilir olduğu gibi, doğru olanı ve tabloların oluşturulmasını sağladım. –

İlgili konular