- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:我的 Web MVC 应用程序正在插入成分表。我不想要这个,因为我已经在该表中填充了 1000 种不同的洗发水成分。
我确实尝试弄乱“cascade=CascadeType.ALL”设置,但通常得到“对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例:com.app.entity.Ingredient”。但我真的不确定这是否能解决任何问题。
结果用户提交后和插入数据库之前的 toString() 输出:
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 的东西:
Hibernate: insert into company (company_name) values (?)
Hibernate: insert into shampoo (shampoo_company, shampoo_name) values (?, ?)
Hibernate: insert into ingredient (ingredient_name) values (?)
Hibernate: insert into ingredient (ingredient_name) values (?)I do not want it to be inserting into ingredient table because I have already populated the table with 1000 ingredient names. Realistically I would just want to insert into shampoo_ingredients with the key of the given ingredient.
Hibernate: insert into shampoo_ingredients (fk_shampoo, fk_ingredient) values (?, ?)
Hibernate: insert into shampoo_ingredients (fk_shampoo, fk_ingredient) values (?, ?)
洗发水实体
@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 + "]";
}
}
洗发水 Controller
@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";
}
}
洗发水 DAO
@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);
}
}
洗发水形式
<%@ 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>
最佳答案
重点是,当您尝试加入实体洗发水和成分时,您必须从数据库中获取它们。
假设您创建了一种新洗发水。你可以这样做:
Shampoo s = new Shampoo();
//All your own stuffs about Shampoo object
现在你想加入洗发水和成分;假设您想要加入的成分名称是“IngrA”和“IngrB”,但您不能这样做:
Ingredient a = new Ingredient();
a.setName("IngrA");
Ingredient b = new Ingredient();
b.setName("IngrB");
List<Ingredient> ingrs = new ArrayList<>(2);
ingrs.add(a);
ingrs.add(b);
s.setIngredients(ingrs);
repository.save(s); //Error will be thrown here; If you have CascadeType.All an insert will be done
为什么会出现错误?因为根据 Hibernate a
和 b
是您从未保存过的"new"对象。所以 hibernate 告诉你:“在你加入他们之前,你必须保存他们”。
另一方面,由于您有 CascadeType.All
hibernate 会尝试插入这些"new"对象
你要做的就是在数据库中搜索成分,然后设置它们。
我的意思是这样的:
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
为什么没有错误?因为您从数据库中检索了成分,现在它们不再分离。
希望有用
安杰洛
关于java - 如何阻止 hibernate 在 ManyToMany 映射中插入表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53952565/
我刚开始学习JSP技术,遇到了瓶颈。 如何从 JSP 声明 block ? 这不起作用: ... 服务器说没有“out”。 U: 我确实知道如何使用返回字符串的方法重写代码,但是有没有办法在 ?
在一个字段中,我想设置一个具有自定义过滤器的自定义分析器-着眼于词干-因此,“闪存卡”和“闪存卡”的词根相同,因此返回的结果相同 当我运行以下查询时,我的命中率很高,但是“闪存卡”和“闪存卡”各自返回
快速提问。 我有一个通过 PInvoke 使用 native DLL 的应用程序,这个 DLL 可能会调用 PostQuitMessage()。 如何避免? (因为我的应用程序不应该关闭) 我试过 A
一些给定的 HTML 文章,例如: Content 与一些基本的 Jquery 结合使用,例如: $(".some_
我正在构建一个灯箱相册。当第一个图像加载时,CSS 转换起作用。当加载后的每个图像都没有。任何想法为什么?加载第一张之后的照片,但没有过渡。 Image.prototype.load = functi
这个问题在这里已经有了答案: Disable recent tasks button on Android 5.0 (2 个答案) 关闭 2 年前。 我知道这个问题之前在这里被问过 Android
我是 Objective-C 的新手,我只是想弄清楚我是否可以使用 block 或选择器作为 UIAlertView 的 UIAlertViewDelegate 参数 - 哪个更合适? 我已经尝试了以
我是 Linux (UNIX) 套接字下套接字编程的新手。我在 Internet 上找到了以下代码,用于为每个连接生成一个线程的 tcp 服务器。但是它不起作用。accept() 函数立即返回,不等待
recv()库函数手册页提到: It returns the number of bytes received. It normally returns any data available, up
我有一个用于其他项目的共享 ts 库。在这个库中有被同一个库的其他资源使用的资源。该库的结构分为 components/*、interfaces/*、services/* 等目录。在每个目录的根目录中
我想在同一行中一个接一个地显示我的 ListView ,但 ListView 显示每个新行中的每个项目。我怎样才能防止换行显示。以便它显示为段落 ListView.builder( shr
我有一个包含数千行的表格。 import React from "react" import { useSelector } from "react-redux"; import { useEffec
假设我通常希望收到关于代码中不完整模式的警告,但有时我知道某个函数的模式不完整,我知道这很好。 是still true GHC 的警告粒度是每个模块的,并且没有办法更改有关特定功能或定义的警告? 最佳
我的网络应用程序发送浏览器通知,我知道如何检查通知的浏览器权限,以及如果未授予权限,如何请求权限。 但是,即使用户授予我的站点发送通知的权限,她可能仍然无法收到通知,因为它们 might be dis
我有 Xcode 3.2.1,并且喜欢使用它,但是当我编辑文本中带有超链接的文件时(例如,带有引用的注释:# see http://example.com)Xcode 将文本变成可点击的超链接。尝试编
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我有一个在 MY_Controller 中运行的 acl。如果权限被拒绝,那么此刻,我只是执行 redirect('denied') - 这是一个非常基本的 Controller ,它加载一个非常基本
我一直很好奇尝试从 Chrome 切换到 Firefox Quantum,但是对于 Web 开发遇到了一个我无法轻松解决的主要障碍——它正在缓存我的本地主机文件,因此当我尝试在本地主机加载各种 emb
这真的让我很兴奋!在任何时候,我都会参与多个项目。当我退出Xcode时,下次打开Xcode时,我前一天的所有项目都会自动一一打开。 经常我最终编辑错误的文件,AHHHHHHHHHHH!我可以阻止这种行
我的Wiki上有500个左右的Spambot和大约5个实际注册用户。我已经使用nuke删除了他们的页面,但是他们一直在重新发布。我已经使用reCaptcha控制了spambot的注册。现在,我只需要一
我是一名优秀的程序员,十分优秀!