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