Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 如何阻止hibernate在许多映射中插入到表中?_Java_Spring_Hibernate_Spring Mvc_Many To Many - Fatal编程技术网

Java 如何阻止hibernate在许多映射中插入到表中?

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

问题:我的web MVC应用程序正在插入配料表。我不想要这个,因为我已经用1000种不同的洗发水成分填充了表格

我确实尝试过弄乱“cascade=CascadeType.ALL”设置,但我通常得到“对象引用一个未保存的临时实例-在刷新之前保存临时实例:com.app.entity.component”。但我真的不确定这是否能解决任何问题

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: 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