Java 如何阻止hibernate在许多映射中插入到表中?
问题:我的web MVC应用程序正在插入配料表。我不想要这个,因为我已经用1000种不同的洗发水成分填充了表格 我确实尝试过弄乱“cascade=CascadeType.ALL”设置,但我通常得到“对象引用一个未保存的临时实例-在刷新之前保存临时实例:com.app.entity.component”。但我真的不确定这是否能解决任何问题 toString()在用户提交结果之后和插入数据库之前的输出:Java 如何阻止hibernate在许多映射中插入到表中?,java,spring,hibernate,spring-mvc,many-to-many,Java,Spring,Hibernate,Spring Mvc,Many To Many,问题:我的web MVC应用程序正在插入配料表。我不想要这个,因为我已经用1000种不同的洗发水成分填充了表格 我确实尝试过弄乱“cascade=CascadeType.ALL”设置,但我通常得到“对象引用一个未保存的临时实例-在刷新之前保存临时实例:com.app.entity.component”。但我真的不确定这是否能解决任何问题 toString()在用户提交结果之后和插入数据库之前的输出: Shampoo [id=0, name=sas, company=Company [id=0
Shampoo [id=0, name=sas, company=Company [id=0, name=asassa], ingredients=[Ingredient [id=0, name=1-Dodecene, shampoos=null], Ingredient [id=0, name=Acetylated, shampoos=null]]]
Hibernate: insert into company (company_name) values (?)
Hibernate: insert into shampoo (shampoo_company, shampoo_name) values (?, ?)
休眠内容:
Shampoo [id=0, name=sas, company=Company [id=0, name=asassa], ingredients=[Ingredient [id=0, name=1-Dodecene, shampoos=null], Ingredient [id=0, name=Acetylated, shampoos=null]]]
Hibernate: insert into company (company_name) values (?)
Hibernate: insert into shampoo (shampoo_company, shampoo_name) values (?, ?)
我不希望它被插入到配料表中,因为我已经用1000个配料名称填充了该表。现实地说,我只想在洗发水中加入含有给定成分的成分
洗发水实体
@Entity
@Table(name="shampoo")
public class Shampoo {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="shampoo_id")
private int id;
@Column(name="shampoo_name")
private String name;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="shampoo_company")
private Company company;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
name="shampoo_ingredients",
joinColumns=@JoinColumn(name="fk_shampoo"),
inverseJoinColumns=@JoinColumn(name="fk_ingredient")
)
private List<Ingredient> ingredients;
public Shampoo() {
}
public Shampoo(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
public List<Ingredient> getIngredients() {
return ingredients;
}
public void setIngredients(List<Ingredient> ingredients) {
this.ingredients = ingredients;
}
@Override
public String toString() {
return "Shampoo [id=" + id + ", name=" + name + ", company=" + company + ", ingredients=" + ingredients + "]";
}
}
@Entity
@Table(name="ingredient")
public class Ingredient {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ingredient_id")
private int id;
@Column(name="ingredient_name")
private String name;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
name="shampoo_ingredients",
joinColumns=@JoinColumn(name="fk_ingredient"),
inverseJoinColumns=@JoinColumn(name="fk_shampoo")
)
private List<Shampoo> shampoos;
public Ingredient() {
}
public Ingredient(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Shampoo> getShampoos() {
return shampoos;
}
public void setShampoos(List<Shampoo> shampoos) {
this.shampoos = shampoos;
}
@Override
public String toString() {
return "Ingredient [id=" + id + ", name=" + name + ", shampoos=" + shampoos + "]";
}
}
@实体
@表(name=“洗发水”)
公营洗发水{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“洗发水id”)
私有int-id;
@列(name=“洗发水名称”)
私有字符串名称;
@OneToOne(级联=级联类型.ALL)
@JoinColumn(name=“洗发水公司”)
私营公司;
@多个(级联=级联类型.ALL)
@可接合(
name=“洗发水成分”,
joinColumns=@JoinColumn(name=“fk_”),
inverseJoinColumns=@JoinColumn(name=“fk_”)
)
私人成分清单;
公共洗发水(){
}
公共洗发水(字符串名称){
this.name=名称;
}
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
上市公司{
返回公司;
}
上市公司(公司){
这个公司=公司;
}
公共列表{
返回成分;
}
公共成分(列出成分){
这个。成分=成分;
}
@凌驾
公共字符串toString(){
返回“洗发水[id=“+id+”,name=“+name+”,company=“+company+”,components=“+components+””;
}
}
成分实体
@Entity
@Table(name="shampoo")
public class Shampoo {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="shampoo_id")
private int id;
@Column(name="shampoo_name")
private String name;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="shampoo_company")
private Company company;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
name="shampoo_ingredients",
joinColumns=@JoinColumn(name="fk_shampoo"),
inverseJoinColumns=@JoinColumn(name="fk_ingredient")
)
private List<Ingredient> ingredients;
public Shampoo() {
}
public Shampoo(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
public List<Ingredient> getIngredients() {
return ingredients;
}
public void setIngredients(List<Ingredient> ingredients) {
this.ingredients = ingredients;
}
@Override
public String toString() {
return "Shampoo [id=" + id + ", name=" + name + ", company=" + company + ", ingredients=" + ingredients + "]";
}
}
@Entity
@Table(name="ingredient")
public class Ingredient {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ingredient_id")
private int id;
@Column(name="ingredient_name")
private String name;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
name="shampoo_ingredients",
joinColumns=@JoinColumn(name="fk_ingredient"),
inverseJoinColumns=@JoinColumn(name="fk_shampoo")
)
private List<Shampoo> shampoos;
public Ingredient() {
}
public Ingredient(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Shampoo> getShampoos() {
return shampoos;
}
public void setShampoos(List<Shampoo> shampoos) {
this.shampoos = shampoos;
}
@Override
public String toString() {
return "Ingredient [id=" + id + ", name=" + name + ", shampoos=" + shampoos + "]";
}
}
@实体
@表(名称=“成分”)
公共类成分{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(名称=“成分id”)
私有int-id;
@列(名称=“成分名称”)
私有字符串名称;
@多个(级联=级联类型.ALL)
@可接合(
name=“洗发水成分”,
joinColumns=@JoinColumn(name=“fk_”),
inverseJoinColumns=@JoinColumn(name=“fk_”)
)
私人名单洗发水;
公共成分(){
}
公共成分(字符串名称){
this.name=名称;
}
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共列表getShampoos(){
退回洗发水;
}
公共洗发水(列出洗发水){
this.shampoos=洗发水;
}
@凌驾
公共字符串toString(){
返回“成分[id=“+id+”,name=“+name+”,shampoos=“+shampoos+”]”;
}
}
洗发水控制器
@Controller
@RequestMapping("/shampoo")
public class ShampooController {
//inject DAO into controller
@Autowired
private ShampooDAO shampooDAO;
@Autowired
private CompanyDAO companyDAO;
@Autowired
private IngredientDAO ingredientDAO;
@Autowired
private ConversionService cs;
@RequestMapping("/list")
public String listShampoos(Model theModel) {
//get shampoo from DAO
List<Shampoo> theShampoos = shampooDAO.getShampoos();
//add shampoo to model
theModel.addAttribute("shampoos", theShampoos);
return "list-shampoos";
}
@GetMapping("/showFormForAdd")
public String showFormForAdd(Model theModel, ModelMap modelMap) {
//create model attribute to bind form data
Shampoo theShampoo = new Shampoo();
modelMap.addAttribute("shampoo", theShampoo);
List<Ingredient> theIngredients = ingredientDAO.getIngredients();
modelMap.addAttribute("ingredient", theIngredients);
return "shampoo-form";
}
@PostMapping("/saveShampoo")
public String saveShampoo(@ModelAttribute("shampoo") Shampoo theShampoo) {
System.out.println(theShampoo.getIngredients());
System.out.println(theShampoo.toString());
shampooDAO.saveShampoo(theShampoo);
return "redirect:/shampoo/list";
}
}
@控制器
@请求映射(“/shapping”)
公营洗发水控制员{
//将DAO注入控制器
@自动连线
私人香波刀香波刀;
@自动连线
私人公司道公司道;
@自动连线
私有IngreditDao IngreditDao;
@自动连线
私人转换服务;
@请求映射(“/list”)
公共字符串列表洗发水(模型){
//从刀上拿洗发水
列出shampoos=shampooDAO.getShampoos();
//将洗发水添加到模型中
添加属性(“香波”,theShampoos);
返回“列出洗发水”;
}
@GetMapping(“/showFormForAdd”)
用于添加的公共字符串ShowForm(模型、模型映射、模型映射){
//创建模型属性以绑定表单数据
洗发水theShampoo=新洗发水();
addAttribute(“洗发水”,theShampoo);
列出元素=ingredientDAO.getComponents();
添加属性(“成分”,即成分);
返回“洗发水表”;
}
@后映射(“/saveShapping”)
公共字符串saveShappoo(@modeldattribute(“shappoo”)shappoo){
System.out.println(theShampoo.getComponents());
System.out.println(theShampoo.toString());
香波刀。保存香波(theShampoo);
返回“重定向:/洗发水/列表”;
}
}
香波刀
@Repository
public class ShampooDAOImpl implements ShampooDAO {
@Autowired
private SessionFactory sessionFactory;
@Transactional
public List<Shampoo> getShampoos() {
//get current hibernate session
Session currentSession = sessionFactory.getCurrentSession();
//create query
Query<Shampoo> theQuery = currentSession.createQuery("from Shampoo", Shampoo.class);
//execute query and get result list
List<Shampoo> shampoos = theQuery.getResultList();
//return list of shampoo
return shampoos;
}
@Transactional
public void saveShampoo(Shampoo theShampoo) {
Session currentSession = sessionFactory.getCurrentSession();
currentSession.save(theShampoo);
}
}
@存储库
公共类shampodaoimpl实现了shampodao{
@自动连线
私人会话工厂会话工厂;
@交易的
公共列表getShampoos(){
//获取当前休眠会话
会话currentSession=sessionFactory.getCurrentSession();
//创建查询
Query theQuery=currentSession.createQuery(“来自Shappo”,Shappo.class);
//执行查询并获取结果列表
List shampoos=theQuery.getResultList();
//洗发水退货清单
退回洗发水;
}
@交易的
公共洗发水(香波theShampoo){
会话currentSession=sessionFactory.getCurrentSession();
currentSession.save(theShampoo);
}
}
洗发水形式
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<title>Add New Shampoo</title>
<script src="${pageContext.request.contextPath}/resources/jquery-3.3.1.min.js"></script>
<script src="${pageContext.request.contextPath}/resources/chosen.jquery.js"></script>
<link type="text/css" href="<%=request.getContextPath() %>/resources/chosen.css" rel="stylesheet"/>
<script>
$(document).ready(function(e){
// first initialize the Chosen select
$('.test').chosen();
});
</script>
</head>
<body>
<form:form cssClass="form" action="saveShampoo" modelAttribute="shampoo" method="POST">
<table>
<tbody>
<tr>
<td><label>Name:</label></td>
<td><form:input path="name" /></td>
</tr>
<tr>
<td><label>Company:</label></td>
<td><form:input path="company" /></td>
</tr>
<tr>
<td><label>Ingredients:</label></td>
<td><form:select cssClass="test" multiple="true" path="Ingredients" >
<form:options items="${ingredient}" itemValue="name" itemLabel="name" />
</form:select></td>
</tr>
</tbody>
</table>
<input id= "submit" type="submit" value="Save"/>
</form:form>
</body>
</html>
添加新的洗发水
$(文档).ready(函数(e){
//首先初始化所选的选择
$('.test').selected();
});
Ingredient a = ingredientDao.findByName("IngrA");
Ingredient b = ingredientDao.findByName("IngrB");
List<Ingredient> ingrs = new ArrayList<>(2);
if(a!=null)
ingrs.add(a);
if(b!=null)
ingrs.add(b);
s.setIngredients(ingrs);
repository.save(s); //No error will be thrown here