我需要使用hibernate进行一对多插入的帮助

时间:2018-03-29 08:25:31

标签: java eclipse hibernate one-to-many

我是新来的,我想要你的帮助

我试图使用hibernate进行一对多的映射 我有一个公司表和这个表与其他表的关系 brnahes 所以一家公司可能会有很多支持

所以我做了一对多的映射并编写代码及其工作

这是我的DAO代码

公共类公司DAO {

public String createCompany(companyDTO cDto) {

    SessionHelper sessionHelper = new SessionHelper();
    Session session = sessionHelper.getSession();

    session.beginTransaction();
    session.persist(cDto);
    session.getTransaction().commit();
    session.close();

    return "Company Table Created Succesfully";
}

}

这是我的主要内容:

    companyDTO cdto = new companyDTO();
    cdto.setcName("Profix");
    cdto.setcEmail("po@gmail.com");
    cdto.setcPhone("07808551147");
    cdto.setcNbransh(3);

    branshesDTO bdtomain = new branshesDTO();
    bdtomain.setbName("profect");
    bdtomain.setbPhone("0788965452");
    bdtomain.setbEmail("pr@gmail.com");
    bdtomain.setbLocation("Amman");

    branshesDTO bdto2 = new branshesDTO();
    bdto2.setbName("Leeg");
    bdto2.setbPhone("0095622232");
    bdto2.setbEmail("lee@gmail.com");
    bdto2.setbLocation("Amman");

    List<branshesDTO> branshesDTOs = new ArrayList<branshesDTO>();
    branshesDTOs.add(bdtomain);
    branshesDTOs.add(bdto2);

    cdto.setDtos(branshesDTOs);
    companyDAO cdao = new companyDAO();

    String res = cdao.createCompany(cdto);
    System.out.println("Res:" + res);

这是我的hbm.xml文件:

enter image description here

现在我的代码在这里,当我想添加公司 我把它的branshes加在一起

所以现在我做了一个公司和一个bransh

然后,如果我想添加与同一公司ID相关的另一个branshes

我该怎么加?

这是我应用代码后公司的sql表 enter image description here

这是我的branshes表:

enter image description here

正如你在bransh表中看到cid 1我有两次branshes

所以我如何为公司id 1添加另一个bransh

没有在公司表中定义新公司?

我想在一个功能中添加公司 并且不要在另一个函数上添加bransh

我该怎么办?

2 个答案:

答案 0 :(得分:0)

首先你可以设置映射文件

 <set name="dtos" inverse="true" cascade="all">

“inverse”关键字始终以一对多和多对多的关系声明,这意味着哪一方负责处理这种关系。

关于在一家公司中添加多个分支而不声明新公司

你可以制作一个方法,将公司的主键作为参数并预先确定该公司然后你可以添加你的分支

例如在你的dto添加

 public void addBranch(BranchDTO branchDTO ){
    branchDTO .setCompanyDto(this);
    dtos.add(branchDTO);
}

您可以在现有公司中添加新分支 你可以用其身份

来压制公司
public void addANewBranch(BranchDTO branchDTO, Integer companyDtoId) {

    Session session = sessionFactory.openSession();
    try {

        session.getTransaction().begin();
        CompanyDto com= session.get(CompanyDto .class,companyDtoId);
         com.addBranch(branchDTO);
        session.update(com);
        session.getTransaction().commit();

    } catch (Exception e) {
        session.getTransaction().rollback();
        logger.error("Error occurredr. Error stack trace: " + e.toString());
    } finally {
        session.close();
    }

在主类中你可以调用这个方法

BranchDTO branchDTO = new BranchDTO ("your fields values");
yourobjectDao.addANewBranch(branchDTO , your company id)

我认为这会有所帮助 child and parent relationship

在我的主要代码上写下这段代码之后:

branshesDTO bdtoo = new branshesDTO();
companyDAO comdao = new companyDAO();

bdtoo.setbName("bbffffbbb");
bdtoo.setbPhone("215f51");
bdtoo.setbEmail("s@gmail.com");
bdtoo.setbLocation("jhhhhjj");
comdao.addANewBranch(bdtoo, 1);

并运行它,我在我的控制台上得到了这个例外:

Mar 29, 2018 1:05:41 PM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Mar 29, 2018 1:05:41 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Mar 29, 2018 1:05:41 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/omartest]
Mar 29, 2018 1:05:41 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=root, password=****}
Mar 29, 2018 1:05:41 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Mar 29, 2018 1:05:41 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Thu Mar 29 13:05:41 EET 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Mar 29, 2018 1:05:41 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Mar 29, 2018 1:05:42 PM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@7e1a1da6] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

所以现在我要做什么?

答案 1 :(得分:-1)

首先根据公司名称(如果它是唯一的)获取公司ID,然后您可以将其他分支详细信息添加到同一公司。确保使用session.get方法而不是load方法...因为当我们使用load方法时,如果给定公司没有名称,你将得到对象未找到异常,所以最好使用get方法。