2014-11-24 34 views
0
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表即使在代码中的异常休眠oneToOne映射不读joinColumn类实例

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) 
+0

格式化偏斜。我对stackoverlow很陌生,并且对如何格式化非常困惑。问题是在上面的代码中,我能够准确地存储HeadOfState的值,但是在我尝试获取值时使用相同的代码,我得到一个异常,该对象不存在。基本上,我检索国家对象,它有HeadOfState对象hos,出于某种原因,它出现为null。即使数据库表有记录 – curiousengineer 2014-11-24 23:11:02

+0

尝试'session.persist'而不是'session.save' – geert3 2014-11-25 09:07:28

+1

请注意,在您的数据库中,在hos表中,您有列host_id,并且在您的映射类中有以下内容:@Column (name =“hos_id”) – drgPP 2014-11-25 09:13:24

回答

0

尝试两侧设置相关对象协会。 当您保存您的实例:

hos.setCountry(countObj); 

,并添加

countObj.setHos(hos); 

你可以一个方便易方法添加到您的任何实例一样的,因此,你会打电话两种方法之一INSEAD。

+0

谢谢,但问题是其他地方(没有更改我发布的代码)。在具有发生异常的主要方法的类中,当我使用main运行该类时,如果在第一次运行中,我会执行session.save,并且当您看到我进一步检索时,我会得到我正在讨论的异常。但在下一次运行中,如果我只是尝试检索保存的对象,它完美地工作。问题是我想的其他事情 – curiousengineer 2014-11-25 18:07:04