【问题标题】:Generic Hibernate DAOGeneric Hibernate DAO
【发布时间】:2025-12-12 14:00:01
【问题描述】:

如果有人可以提供帮助,我们将不胜感激。

我的计划是有两层。一是服务层,二是DAO层。服务层做业务逻辑,DAO层做CRUD数据操作。

有两个名为 Person 和 Order 的休眠实体。这两个实体实现了一个 BaseEntity 接口。想在DAO层写一个泛型方法,让它可以取任何实体。

关于如何编写通用 dao 方法的任何建议?

@Entity
@Table(name = "PERSON")
public class Person implements BaseEntity, java.io.Serializable {

private int id;
private String firstName;

public Person() {
}

@Id
@Column(name = "PERSON_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
    return id;
}

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

@Column(name = "FIRST_NAME", nullable = false, length = 50)
public String getFirstName() {
    return firstName;
}

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

@Entity
@Table(name = "PURCHASE_ORDER")
public class Order implements BaseEntity java.io.Serializable {

private int id;

public Order() {
}

@Id
@Column(name = "ORDER_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
    return id;
}

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

@Transient
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<OrderItem> getOrderItems() {
    return orderItems;
}

public void setOrderItems(Set<OrderItem> orderItems) {
    this.orderItems = orderItems;
}
}

您能否建议如何创建一个应该将 Person 或 Order 实体作为输入参数的通用方法?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    【讨论】:

    【解决方案2】:

    让 Person 和 Order 子类化一个基础 DAO,让方法接受 DAO。

    【讨论】:

    • 感谢您的帮助。但它不明白。让我在这里给出我的代码,以便您进一步提出建议。
    • 我读对了吗 - 你建议实体对象扩展 DAO?
    【解决方案3】:

    这是编写通用 fetch 方法的方式:

     public <T> T get(long id,Class<T> clazz) throws Exception{
    
                Session session = null;
                T t=null;
                try
                {
                    session=getSessionFactory().openSession();
                    t= (T) session.get(clazz.getCanonicalName(),id);
                }
                catch(Exception e)
                {
                    throw e;
                }
                        finally{
                              if(session!=null) session.close();
                        }
                return t;
            }
    

    忽略异常处理。使用您自己的异常处理技术。

    【讨论】:

    • 您可能会考虑通用主键类型,就像@Nathan Hughes 在您的回答前 2 小时提到的文章中所建议的那样。
    • 是的..我应该这样做..以容纳复合键..这就像一场噩梦..废话..该死的可扩展接口!