2016-06-28 61 views
1

我正在创建数据库实体对象Order,并将其分配给BookingCode类型的多个实体。级联坚持创建重复的行?

问题:这会在db中创建单个订单,这很好。但订单本身有一个@OneToOneOrderDescription,这在数据库中发生重复。

@Entity 
public class BookingCode { 
    @Id 
    private Long id; 

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.DETACH}) 
    private Order order; 
} 

@Entity 
public class Order { 
    @Id 
    private Long id; 

    private String orderName; 

    @OneToOne(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) 
    private OrderDescription description; 
} 

@Entity 
public class OrderDescription { 
    @Id 
    private Long id; 

    //for simplicity just one text element; of course multiple fields in real life 
    private String text; 

    @OneToOne 
    private Order order; 
} 

测试:

Order order = new Order(); 
order.setOrderName("test"); 

OrderDescription d = new OrderDescription("testdescr"); 
d.setOrder(order); 
order.setDescription(d); 

List<BookingCodes> codes = new ArrayList<>(); 

BookingCode code = new BookingCode(); 
code.setOrder(order); 
codes.add(order); 

BookingCode code2 = new BookingCode(); 
code2.setOrder(order); //using the same offer entity! 
codes.add(order2); 

codes = dao.save(codes); //CrudRepository from Spring 

dao.findOne(codes.get(0).getId()); //this works, find an order which has one of the OrderDescriptions 

结果: 在我的数据库我再有 OrderDescription项,在那里我会希望只有一个,因为我重用相同Order对象,并将其分配给不同BookingCode对象。

像:

table order_descrption: 
1;"de";"testdescr";"123456" 
2;"de";"testdescr";"123456" 

由于Order@OneToOne关系OrderDescription 我甚为什么使用findOne()作品正确select不明白。因为在数据库中我现在有两个OrderDescriptions映射到相同的Order,但Order只能有其中之一。

+0

你有一个正确的hashCode和equals方法吗? –

+0

我没有任何散列或等于方法。但是不应该hibernate能够检测到我要保存相同的'Order'并且在同一个'OrderDescription'中? – membersound

+1

没有正确的equals/hashcode实现。 JPA对它的工作原理相当挑剔。它将管理对象的对象替换为不匹配的对象。如果没有适当的equals/hashcode实现,hibernate无法检测到这一点。因此,建议首先在其他任何事情之前坚持订单。 –

回答

1

先保留订单,然后将其分配给两个bookingCode。

+0

工作,谢谢。无论如何,我想知道是否仍然可以一次性保存这些对象。 – membersound

+0

应该有一个主键分配给订单,以确定订单是否相同 –