JPA:将两个字段作为唯一键或让jpa更新但不插入

时间:2019-05-10 02:53:14

标签: jpa spring-data-jpa

这是我的实体:

@Entity(name = "order_info")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    // the user who create this order
    @OneToOne
    private User user;

    // the product of this order
    @OneToOne
    @Basic(fetch = FetchType.LAZY)
    private Product product;

    // money
    private Integer monkey;

我的要求是:

用户+产品应为唯一键,每个用户只能为一个产品创建一个订单。

我的问题是:


    @Autowired
    private OrderCrudRepository repository;

    @Test
    public void save(){
        User user = new User();
        user.setId(2);

        Product product = new Product();
        product.setId(1);

        Order order = new Order();
        order.setMoney(33);

        order.setProduct(product);
        order.setUser(user);

        repository.save(order);
        System.out.println(JSONObject.toJSONString(order, true));
    }

有时候,我想更新记录,如果但不保存的话。不幸的是,我在SpringDataJPA中找不到更新。

如果数据库中已有一条包含用户和产品价值的记录,我想强制JPA更新数据库。

我该怎么办?

2 个答案:

答案 0 :(得分:0)

JPA中没有saveOrUpdate。我要做的是搜索一条记录,以防万一发现使用EntityManager使用显式更新语句对其进行更新。

答案 1 :(得分:0)

要指定唯一键,只需在实体类的顶部添加注释:

@Table(uniqueConstraints={@UniqueConstraint(columnNames={"userId", "productId"})})

为了进行更新,您必须首先找到托管实体,然后使用所需的任何值更新实体。例如:

Order order = orderRepo.findById(id);
order.setUser(...)
order.setProduct(...)