Hibernate oneToOne映射不读取joinColumn类实例

时间:2014-11-24 23:09:15

标签: java hibernate

package com.hibernatetest;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name = "country")
public class Country {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ctry_id")
private Integer id;

@Column(name = "ctry_name")
private String name;


@Transient
private int rank;

@ManyToOne
@JoinColumn(name="fk_cont_id")
private Continent continent;

@OneToOne(mappedBy="country")
private HeadOfState hos;

public HeadOfState getHos() {
    return hos;
}

public void setHos(HeadOfState hos) {
    this.hos = hos;
}

public Continent getContinent() {
    return continent;
}

public Country() {
    ;
}
public Country(String name) {
    this.name = name;
}
public void setContinent(Continent continent) {
    this.continent = continent;
}

public Integer getId() {
    return id;
}

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setRank(int rank) {
    this.rank = rank;
}

public int getRank() {
    return rank;
}

public void addCountryToDb(Continent cont) {
    continent = cont;
}

}


package com.hibernatetest;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="hos")
public class HeadOfState {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="hos_id")
private Integer id;

@Column(name="hos_name")
private String name;

@OneToOne
@JoinColumn(name="fk_ctry_id")
private Country country;

public HeadOfState() {

}

public HeadOfState(String name) {
    this.name=name;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Country getCountry() {
    return country;
}

public void setCountry(Country country) {
    this.country = country;
}



}

Session session = HibernateUtil.getSessionFactory().openSession();
    try {
    Transaction transaction = session.getTransaction();
    Country countObj = (Country)session.get(Country.class, 62);
    HeadOfState hos = new HeadOfState("ghanaKing");
    hos.setCountry(countObj);
    transaction.begin();
    session.save(hos);
    transaction.commit();

    Country cont = (Country)session.get(Country.class, 62);
    System.out.println("name of country is "+cont.getName());
    System.out.println("name of continent is "+cont.getContinent().getName());
    HeadOfState newhos = cont.getHos();
    if (newhos == null) {
        throw new Exception("hos obj is null even after storing it");
    }
    System.out.println("Name of HOS is "+cont.getHos().getName());
    } catch (Exception ex) {
        System.out.println("exception has happened: "+ex.getMessage());
        throw ex;
    } finally {
        session.close();
        HibernateUtil.shutdown();
    }
}

即使代码

中有例外,也会输出SQL表
ysql> select * from hos;
host_id, hos_name, fk_ctry_id
2,       ghanaKing,62
1 row in set (0.00 sec)

mysql> select * from country
ctry_id, ctry_name, fk_cont_id
60, England, 30
62, ghana, 30

Eclipse异常

name of country is ghana
name of continent is Asia
exception has happened hos obj is null even after storing it

Nov 24, 2014 2:54:29 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://172.23.180.81:3306/test]
Exception in thread "main" java.lang.Exception: hos obj is null even after storing it
    at com.hibernatetest.SqlTest.main(SqlTest.java:37)

1 个答案:

答案 0 :(得分:0)

尝试在关联的两侧设置相关对象。 保存实例时:

hos.setCountry(countObj);

并添加

countObj.setHos(hos);

你可以为你的任何一个实例添加一个方便的方法,因此你会调用一个两个方法的一个方法。