简体   繁体   English

Hibernate 一对一关系和外键问题

[英]Hibernate One To One relation and problem with foreign key

I have a strange problem that I can't locate.我有一个奇怪的问题,我找不到。 I have two classes, Employee and Address, to create two tables with a one-to-one relationship.我有两个类,Employee 和 Address,用于创建两个具有一对一关系的表。 When I check the result of an operation I see that the records have added, but without the foreign key to the address in table Employee example:当我检查操作的结果时,我看到记录已添加,但没有表 Employee 示例中地址的外键:

1   John      Smith     12333    null

where null is address_ID.其中 null 是 address_ID。 When I check Address Table i see that record is added but the begin number of id is two.当我检查地址表时,我看到添加了记录,但 id 的起始编号为 2。

2   New York    st. Aperman 234 12  03999

Employee.class员工类

@Entity
public class Employee {
@Id
@GeneratedValue
private long id;

private String firstName;
private String lastName;
private double salary;

@OneToOne 
@JoinColumn(name = "address_ID") 
private Address address;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

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

public String getLastName() {
    return lastName;
}

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

public double getSalary() {
    return salary;
}

public void setSalary(double salary) {
    this.salary = salary;
}

public Address getAddress() {
    return address;
}

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

} }

Address.class地址类

@Entity
public class Address {
@Id
@GeneratedValue
private long id;

public String locality;
public String zipCode;
public String street;
public int streetNumber;


public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getLocality() {
    return locality;
}

public void setLocality(String locality) {
    this.locality = locality;
}

public String getZipCode() {
    return zipCode;
}

public void setZipCode(String zipCode) {
    this.zipCode = zipCode;
}

public String getStreet() {
    return street;
}

public void setStreet(String street) {
    this.street = street;
}

public int getStreetNumber() {
    return streetNumber;
}

public void setStreetNumber(int streetNumber) {
    this.streetNumber = streetNumber;
}

} }

Main.class主类

public class Main {

public static void main(String[] args) {
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("tutorialdb");
    EntityManager entityManager = entityManagerFactory.createEntityManager();

    Employee employee = new Employee();
    Address adres = new Address();      
            employee.setFirstName("John");
            employee.setLastName("Smith");
            employee.setSalary(12333.0);
            adres.setLocality("New York");
            adres.setZipCode("03999");
            adres.setStreet("st. Aperman 234");
            adres.setStreetNumber(12);

            entityManager.getTransaction().begin();
            entityManager.persist(employee);
            entityManager.persist(adres);
            entityManager.getTransaction().commit();


    entityManager.close();
    entityManagerFactory.close();

}

} }

persistence.xml持久化文件

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="tutorialdb"
    transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
     <property name="javax.persistence.jdbc.user" value="user"/>
     <property name="javax.persistence.jdbc.password" value="password"/>
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/tutorial"/>
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
     <property name="hibernate.hbm2ddl.auto" value="create"/>
    </properties>
</persistence-unit>

You need to set the Address reference in the Employee before persisting.在持久化之前,您需要在Employee设置Address引用。

Address adres = new Address();
...

employee.setAddress(adres);

Foreign Key in the Employee table is null as no address is set in Employee .外键Employee表是null ,因为没有地址在设置Employee

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM