【发布时间】:2017-03-07 22:04:21
【问题描述】:
我的数据库中有两个表Brand 和Product,结构如下:
|品牌 |标识PK |
|产品 |标识PK | brand_id FK |
以及该表的实体:
@Entity
@Table(name = "Brand")
public class Brand {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "brand")
private String brand;
/* getters and setters */
}
@Entity
@Table(name = "Product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "brand_id")
private Brand brand;
/* getters and setters */
}
当我使用 Spring-Data 时,我有用于 Brand 的存储库和服务:
@Repository
public interface BrandRepository extends JpaRepository<Brand, Long> {
Brand findByBrand(String brand);
}
public interface BrandService {
Brand findByBrand(String brand);
}
@Service
public class BrandServiceImpl implements BrandService {
@Autowired
private BrandRepository brandRepository;
@Override
public Brand findByBrand(String brand) {
return brandRepository.findByBrand(brand);
}
}
对于产品:
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}
public interface ProductService {
Product save(Product product);
}
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductRepository productRepository;
@Override
public Product save(Product product) {
return productRepository.save(product);
}
}
目标是保存 Product 对象。如果 db 中不存在 Brand 对象,则应自动保存它,否则应设置为 Product:
Brand brand = brandService.findByBrand(brandName);
if (brand == null) {
brand = new Brand();
brand.setBrand("Some name");
}
product.setBrand(brand);
productService.save(product);
如果具有指定品牌名称的品牌对象不在我的数据库中,它可以正常工作。但如果是我得到:
PersistentObjectException: detached entity passed to persist
品牌。
我可以将级联类型更改为 MERGE,它会正常工作。但是,如果我使用 MERGE 级联类型运行代码并且具有指定品牌名称的品牌对象不在我的数据库中,我会得到
IllegalStateException:
org.hibernate.TransientPropertyValueException:
object references an unsaved transient instance - save the transient instance before flushing
对于品牌(这并不奇怪)。
应该是什么级联类型?还是我做错了什么?
【问题讨论】:
-
很可能是由于缺少交易。产品来自哪里?发布您构建和保存产品的整个类。
标签: java hibernate spring-data