【问题标题】:How to build a has-a-relationship connection between a Pojo class and an abstract class using Hibernate Annotations如何使用 Hibernate Annotations 在 Pojo 类和抽象类之间建立具有关系的连接
【发布时间】:2011-08-05 08:45:20
【问题描述】:

我有一个名为 Driver.Java 的类,另一个名为 Truck.Java 的类和一个名为 Vehicle.Java 的抽象类。一个司机可以驾驶几辆车,卡车,公共汽车等。我想模拟这种情况。 Driver.Class 和 Vehicle.Class 通过 has-a-relationship 相互连接。代码如下。

驱动程序.Java

@Entity
@Table(name="DRIVER")

public class Driver {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int driverId;

@OneToOne(cascade=CascadeType.ALL)
private Vehicle vehicle;

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

@Column(name="AGE")
private int age;

public Vehicle getVehicle() {
    return vehicle;
}
public void setVehicle(Vehicle vehicle) {
    this.vehicle = vehicle;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
public Driver(String name, int age) {
    this.name = name;
    this.age = age;
}
public void setDriverId(int driverId) {
    this.driverId = driverId;
}
public int getDriverId() {
    return driverId;
}

Vehicle.Java

@MappedSuperclass
public abstract class Vehicle {

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

@Column(name="BRAND")
private String brand;

@Column(name="COLOUR")
private String colour;

@Column(name="PRICE")
private int price;

public String getBrand() {
    return brand;
}
public void setBrand(String brand) {
    this.brand = brand;
}
public String getColour() {
    return colour;
}
public void setColour(String colour) {
    this.colour = colour;
}
public int getPrice() {
    return price;
}
public void setPrice(int amount) {
    this.price = amount;
}

public abstract int totalCost();
public Vehicle(String brand, String colour, int price) {
    this.brand = brand;
    this.colour = colour;
    this.price = price;
}
public void setId(int id) {
    this.id = id;
}
public int getId() {
    return id;
}

public Vehicle(){}  
}

主要

    Vehicle vehicle2 = new Truck("Mercedes", "White", 250);
    Driver driver = new Driver("Hakan Namlı", 36);
    driver.setVehicle(vehicle2);
    DriverDAO dDao = new DriverDAO();
    dDao.addDriver(driver); 

DriverDAO.Java

public class DriverDAO {

private Session session;

public void addDriver(Driver driver){

    try {
        session = HibernateUtil.getSessionFactory().openSession();
        session.getTransaction().begin();
        session.save(driver);
        session.getTransaction().commit();
    }
    catch(HibernateException ex){
        session.getTransaction().rollback();
        ex.printStackTrace();
    }
    finally{
        session.close();
    }
}
}

HibernateUTIL.Java 公共类 HibernateUtil {

private static final SessionFactory sessionFactory;

static {
    try {
        sessionFactory = new AnnotationConfiguration()
        .configure()
        .addPackage("models") 
        .addAnnotatedClass(Driver.class)
        .addAnnotatedClass(Vehicle.class)
        .addAnnotatedClass(Truck.class)
        .addAnnotatedClass(Bus.class)
        .buildSessionFactory();

    } catch (Throwable ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
}

hibernate.cfg.xml

<hibernate-configuration>
    <session-factory>
        <property      
     name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="hibernate.connection.url">...</property>
    <property name="hibernate.connection.username">...</property>
    <property name="hibernate.connection.password">...</property>
    <property name="hibernate.connection.pool_size">10</property>
    <property name="show_sql">true</property>
    <property name="dialect">org.hibernate.dialect.OracleDialect</property>
    <property name="hibernate.hbm2ddl.auto">update</property>   
</session-factory>

这是输出:

1 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.5.2-Final
11 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.2-Final
12 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
14 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
17 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
75 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
79 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
79 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
128 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: null
128 [main] INFO org.hibernate.cfg.AnnotationConfiguration - Mapping package models
146 [main] WARN org.hibernate.cfg.AnnotationBinder - Package not found or wo package-info.java: models
154 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
177 [main] INFO org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: models.Driver
201 [main] INFO org.hibernate.cfg.annotations.EntityBinder - Bind entity models.Driver on table DRIVER
238 [main] INFO org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: models.Truck
239 [main] INFO org.hibernate.cfg.annotations.EntityBinder - Bind entity models.Truck on table TRUCK
241 [main] INFO org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: models.Bus
241 [main] INFO org.hibernate.cfg.annotations.EntityBinder - Bind entity models.Bus on table BUS
Exception in thread "main" java.lang.NullPointerException
    at dao.DriverDAO.addDriver(DriverDAO.java:28)
    at main.Main.main(Main.java:39)

当我尝试运行它时,SessionFactory 类的对象返回 null。因此,我无法生成 Session 对象,也无法保存数据。这与休眠配置文件无关,因为我在不同的场景中尝试过。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 一个对象不返回任何东西。有一个方法。向我们展示您遇到问题的代码,并解释实际问题。

标签: java hibernate annotations


【解决方案1】:

给B类添加@Inheritance注解。 您还可以使用诸如

之类的策略值来定义为带有 @inheritance 注释的继承类创建哪种类型的表
@Inherintace(strategty = InheritanceType.TABLE_PER_CLASS)

编辑:

当您使用 new 关键字创建 DriverDAO 对象时,它的所有属性都只有默认值,并且所有对象都为空。 您应该使用正确的值初始化 dDAO 对象

DriverDAO dDAO = new DriverDAOImpl();
dDAO.setSessionFactory(sessionFactory);

或者,如果您在构造函数中初始化 DriverDAO,请提供该代码。实体类与这个问题无关。

【讨论】:

  • 感谢您的回复,但没有成功。 SessionFactory 类的对象仍然返回 null。
  • 所以你的 bDAO.sessionFactory 属性为空?那么你的依赖注入配置有问题。请发布您的休眠配置
  • 贴出有问题的代码和配置。您粘贴的代码与您描述的问题无关。如果可能,删除代码。
  • 我把所有的代码都放在上面了。感谢您的回复和耐心。
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 2021-05-17
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多