java - 如何使用java在hibernate中一次将数据插入多个表

标签 java mysql hibernate

您好,我正在使用 hibernate 将数据保存到数据库的两个表中。另外,我正在使用 mysql。

这些是我的 POJO 类,

患者.java

public class Patient implements java.io.Serializable {

private Integer idPatient;
private String title;
private String firstName;
private String lastName;
private String middleName;
private Date dob;
private Boolean martitalStatus;
private String gender;
private String nic;
private Date dateCreated;
private Date lastUpdated;
private Set<Contact> contacts = new HashSet<Contact>(0);

public Patient() {
}

public Patient(Date lastUpdated) {
    this.lastUpdated = lastUpdated;
}

public Patient(String title, String firstName, String lastName, String middleName, Date dob, Boolean martitalStatus, String gender, String nic, Date dateCreated, Date lastUpdated, Set<Contact> contacts) {
    this.title = title;
    this.firstName = firstName;
    this.lastName = lastName;
    this.middleName = middleName;
    this.dob = dob;
    this.martitalStatus = martitalStatus;
    this.gender = gender;
    this.nic = nic;
    this.dateCreated = dateCreated;
    this.lastUpdated = lastUpdated;
    this.contacts = contacts;
}

public Integer getIdPatient() {
    return this.idPatient;
}

public void setIdPatient(Integer idPatient) {
    this.idPatient = idPatient;
}

public String getTitle() {
    return this.title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getFirstName() {
    return this.firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return this.lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getMiddleName() {
    return this.middleName;
}

public void setMiddleName(String middleName) {
    this.middleName = middleName;
}

public Date getDob() {
    return this.dob;
}

public void setDob(Date dob) {
    this.dob = dob;
}

public Boolean getMartitalStatus() {
    return this.martitalStatus;
}

public void setMartitalStatus(Boolean martitalStatus) {
    this.martitalStatus = martitalStatus;
}

public String getGender() {
    return this.gender;
}

public void setGender(String gender) {
    this.gender = gender;
}

public String getNic() {
    return this.nic;
}

public void setNic(String nic) {
    this.nic = nic;
}

public Date getDateCreated() {
    return this.dateCreated;
}

public void setDateCreated(Date dateCreated) {
    this.dateCreated = dateCreated;
}

public Date getLastUpdated() {
    return this.lastUpdated;
}

public void setLastUpdated(Date lastUpdated) {
    this.lastUpdated = lastUpdated;
}

public Set<Contact> getContacts() {
    return this.contacts;
}

public void setContacts(Set<Contact> contacts) {
    this.contacts = contacts;
}
}

Contact.java

public class Contact  implements java.io.Serializable {


 private Integer idContact;
 private Patient patient;
 private String telephone;
 private String address;

public Contact() {
}


public Contact(Patient patient) {
    this.patient = patient;
}
public Contact(Patient patient, String telephone, String address) {
   this.patient = patient;
   this.telephone = telephone;
   this.address = address;
}

public Integer getIdContact() {
    return this.idContact;
}

public void setIdContact(Integer idContact) {
    this.idContact = idContact;
}
public Patient getPatient() {
    return this.patient;
}

public void setPatient(Patient patient) {
    this.patient = patient;
}
public String getTelephone() {
    return this.telephone;
}

public void setTelephone(String telephone) {
    this.telephone = telephone;
}
public String getAddress() {
    return this.address;
}

public void setAddress(String address) {
    this.address = address;
}
}

此外,我在这里没有使用注释。

    Patient patient=new Patient();
    Contact contact=new Contact();

    Set<Contact> contacts=new HashSet<Contact>();
    contact.setTelephone("0358965458");
    contact.setAddress("Horana");        
    contacts.add(contact);

    patient.setFirstName("Wajira");
    patient.setLastName("Dahanushka");
    patient.setDateCreated(Common.getSQLCurrentTimeStamp());
    patient.setLastUpdated(Common.getSQLCurrentTimeStamp());        
    patient.setGender("Male");
    patient.setTitle("Mr");
    patient.setNic("9115580466v");
    patient.setContacts(contacts);

    SessionFactory sessionFactory=new HibernateUtil().getSessionFactory();
    Session session=sessionFactory.openSession();     
    session.beginTransaction();

    session.persist(patient);
    session.getTransaction().commit();
    HibernateUtil.shutdown();

患者.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 8, 2016 9:56:01 AM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="db.Patient" table="patient" catalog="example_hibernate" optimistic-lock="version">
        <id name="idPatient" type="java.lang.Integer">
            <column name="idPatient" />
            <generator class="identity" />
        </id>
        <property name="title" type="string">
            <column name="title" length="45" />
        </property>
        <property name="firstName" type="string">
            <column name="firstName" length="45" />
        </property>
        <property name="lastName" type="string">
            <column name="lastName" length="45" />
        </property>
        <property name="middleName" type="string">
            <column name="middleName" length="45" />
        </property>
        <property name="dob" type="date">
            <column name="dob" length="10" />
        </property>
        <property name="martitalStatus" type="java.lang.Boolean">
            <column name="martitalStatus" />
        </property>
        <property name="gender" type="string">
            <column name="gender" length="45" />
        </property>
        <property name="nic" type="string">
            <column name="nic" length="45" />
        </property>
        <property name="dateCreated" type="timestamp">
            <column name="dateCreated" length="19" />
        </property>
        <property name="lastUpdated" type="timestamp">
            <column name="lastUpdated" length="19" not-null="true" />
        </property>
        <set name="contacts" table="contact" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="idPatient" not-null="true" />
            </key>
            <one-to-many class="db.Contact" />
        </set>
    </class>
</hibernate-mapping>

Contact.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 8, 2016 9:56:01 AM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="db.Contact" table="contact" catalog="example_hibernate" optimistic-lock="version">
        <id name="idContact" type="java.lang.Integer">
            <column name="idContact" />
            <generator class="identity" />
        </id>
        <many-to-one name="patient" class="db.Patient" fetch="select">
            <column name="idPatient" not-null="true" />
        </many-to-one>
        <property name="telephone" type="string">
            <column name="telephone" length="45" />
        </property>
        <property name="address" type="string">
            <column name="address" length="45" />
        </property>
    </class>
</hibernate-mapping>

联系人表有一个外键,它是患者表的主键。

当我运行上面的代码时,可以在患者表中看到一条新的患者记录,但在联系人表中看不到任何新的联系人记录。

有什么问题吗。 有什么想法。

最佳答案

您需要告诉 Hibernate 您在患者和他们的联系人之间有一个一对多的关系。完成此操作后,持久化 Patient 对象也应该持久化该患者的整个图表。如果您使用的是注释,那么像这样的东西应该可以工作:

@Entity
@Table(name="Patient")
public class Patient {
    @OneToMany(mappedBy="patient")
    private Set<Contact>  contacts;
}

@Entity
@Table(name="Contact")
public class Contact {
    @ManyToOne
    private Patient patient;
}

关于java - 如何使用java在hibernate中一次将数据插入多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39383049/

相关文章:

java - DAO vs ORM( hibernate )模式

java - 在 java JDBC 连接错误 ORA-28000 : the account got locked, 但数据库帐户未锁定

java - 如何使用 Java 8 方法对 List<List<>> 结构中的每个元素应用一些更改

java - 如何将 Json 传递的日期值分配给 Java 日期对象

java - 为什么 SQLQuery setParameter 不能使用 LIKE?

java - 如何在 Swing 中设置文件的字体大小?

php - 从 SHOW CREATE TABLE 中提取列名

php - mysqli::real_connect(): (HY000/2005): 未知的 MySQL 服务器主机

mysql - MySQL 中缺少 InnoDB

java - 无法将值 Null 插入列 "ID"- hibernate