我有两个实体类。
Order.java
@Entity
@Table(name = "order_table")
public class Order implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "order_id", referencedColumnName = "id", nullable = false, insertable=false, updatable=false)
private Set<Item> items;
// getters & setters & toString
Item.java
@Entity
@Table(name = "item")
public class Item implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "order_id", nullable = false)
private Long orderId;
// getters & setters && toString
我创建了这样的测试类:
@Test
public void createOrderWithItems() {
Item item = new Item();
item.setName("Iron Man");
Order order = new Order();
order.setName("Toy");
order.getItems().add(item);
Order created = service.createOrder(order);
Order orderById = service.getOrderById(order.getId());
System.out.println("Created Order: " + orderById);
Item itemById = service.getItemById(item.getId());
System.out.println("Created item: " + itemById);
Assert.notNull(created.getId(), "Order ID is Null");
}
测试为绿色,但是如果检查输出,则会发现orderId
类中的Item
字段为空。
Created Order: Order{id=1, name='Toy', items=[Item{id=2, name='Iron Man', orderId=null}]}
Created item: Item{id=2, name='Iron Man', orderId=null}
JPA是否不会自动更新数据库中的此列?此列是否多余?如果是这样,我如何从测试代码中检索此信息?
答案 0 :(得分:0)
您需要显式设置orderId。
item.setOrderId(order.getId());
order.getItems().add(item);
您可以在addItem(Item item)
类中创建方法Order
,并将此逻辑隐藏在其中。
级联将在db中创建一个条目,但不会初始化字段。 JPA批注只是向JPA提供程序指示如何在实体和表之间执行映射。
此外,检查您的注释。 @JoinColumn
应该在拥有关系的实体中使用(相应的表具有列作为外键)。查看此问题的顶部答案以获取详细说明:What's the difference between @JoinColumn and mappedBy when using a JPA @OneToMany association