Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中持久化时如何设置唯一行?_Java_Hibernate_Jpa - Fatal编程技术网

Java 在JPA中持久化时如何设置唯一行?

Java 在JPA中持久化时如何设置唯一行?,java,hibernate,jpa,Java,Hibernate,Jpa,我的问题是:有没有办法为“new”关键字创建的行设置唯一行? 我的意思是: Product product = Product.builder() .eancode("EAN-1234") .externalId("123123") .producerPartNumber("123123") .name("VERY GOOD LAP

我的问题是:有没有办法为“new”关键字创建的行设置唯一行? 我的意思是:

Product product = Product.builder()
            .eancode("EAN-1234")
            .externalId("123123")
            .producerPartNumber("123123")
            .name("VERY GOOD LAPTOP")
            .vendor(new Vendor("LENOVO", "www.lenovo.com"))
            .priceDetails(new PriceDetails(
                    new BigDecimal("19.99"),
                    new BigDecimal("20.00"),
                    new BigDecimal("21.00"),
                    Currency.PLN))
            .build();
我希望供应商实体是唯一的,因为现在我得到了类似这样的东西(当我多次运行此代码时):

我只是想先检查一下这个名字是否存在。我应该以某种方式使用@EmbeddedId吗

编辑:现在看

@Override
    public Long save(Product item) {
        EntityManager em = getEntityManager();
        em.getTransaction().begin();
        
        //that line throws PersistentObjectException: detached entity passed to persis
        em.persist(item); //cascade is set as PERSIST so why isn't it work
        
        em.getTransaction().commit();
        em.close();
        return item.getId();
    }

您需要一个
VendorRepository
包含这样的方法
可选的getVendorByNameAndUrl(字符串名称,字符串url)

然后


org.hibernate.persistentObject异常:分离的实体传递给persistent:com.mrfisherman.entity.Vendormake
saveProduct
method
@Transactional
或创建事务手册您可以看到编辑的问题吗?好的,我设置为级联。合并,它可以工作,谢谢
@Override
    public Long save(Product item) {
        EntityManager em = getEntityManager();
        em.getTransaction().begin();
        
        //that line throws PersistentObjectException: detached entity passed to persis
        em.persist(item); //cascade is set as PERSIST so why isn't it work
        
        em.getTransaction().commit();
        em.close();
        return item.getId();
    }
VendorRepository vendorRepo;

@Transactional
public void saveProduct() {    
    Product product = Product.builder()
            .eancode("EAN-1234")
            .externalId("123123")
            .producerPartNumber("123123")
            .name("VERY GOOD LAPTOP")
            .vendor(findVendorOrCreateNew("LENOVO", "www.lenovo.com"))
            .priceDetails(new PriceDetails(
                    new BigDecimal("19.99"),
                    new BigDecimal("20.00"),
                    new BigDecimal("21.00"),
                    Currency.PLN))
            .build();

     // ...
}

Vendor findVendorOrCreateNew(String name, String url) {
    return vendorRepo.getVendorByNameAndUrl(name, url)
        .orElse(new Vendor(name, url));
}