我是hibernate框架的新手,正在开发一个非常简单的结构。
情景:
我有2个表,比如A和B. A中的列是A中的外键,B中是主键。 现在我想将表A中该特定列的值更改为表B中另一列的对应值....仅用于在JSP中显示而不是实际在db本身中。
我想这样做,因为在表A中我有一个代码,在表B中我有相应的值,我想显示值而不是代码。
我怎样才能做到这一点? (也许加入?)
这是我目前的代码:
休眠连接:
public class HibernateConnection {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
return new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
执行查询的类:
public class contactQuery {
public List<contactPersistence> list(String whereClause){
Session session = HibernateConnection.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<contactPersistence> contactList = null;
try {
contactList = (List<contactPersistence>) session.createQuery(" from contactPersistence " + whereClause).list();
session.getTransaction().commit();
} catch (HibernateException e) {
System.out.println(e.getMessage());
session.getTransaction().rollback();
}
return contactList;
}
}
持久性等级:
@Entity
@Table(name="Contacts")
public class contactPersistence implements Serializable{
private static final long serialVersionUID = -8767337896773261247L;
private String Contact_Code;
private String Name;
private String Customer_Code;
//other columns//
@Id
@GeneratedValue
@Column (name="Job_Title")
public String getJob_Title() {
return Job_Title;
}
public void setJob_Title(String Job_Title) {
this.Job_Title = Job_Title;
}
....
....
//other columns defined similarly
....
....
}
在这里,我想将customer_code替换为另一个表中客户的名称。 我尝试更改持久化类中的值(在列的setter方法中)但是通过update命令更改db本身的值。那不是我想要的。
欢迎提出任何建议。
我提供了我认为足够的信息,如果不是,请发表评论。
修改
这是我显示数据的jsp:
<s:iterator value="contactDetail" var="contactTable">
<tr>
<td><s:property value="Name"/></td>
<td><s:property value="Job_Title"/></td>
<td><s:property value="Email"/></td>
<td><s:property value="Phone"/></td>
<td><s:property value="Mobile"/></td>
<td><s:property value="Fax"/></td>
<td><s:property value="Address"/></td>
<td><s:property value="Notes"/></td>
</tr>
</s:iterator>
contactDetail和contactTable来自动作类:
private List<contactPersistence> contactDetail;
public List<contactPersistence> getContactDetail() {
return contactDetail;
}
public void setContactDetail(List<contactPersistence> contactDetail) {
this.contactDetail = contactDetail;
}
private String contactTable;
public String getContactTable() {
return contactTable;
}
public void setContactTable(String contactTable) {
this.contactTable = contactTable;
}
private contactQuery contactQuery;
///////////////////contact detail is populated here//////////
this.contactDetail=contactQuery.list(deWhereClause);
答案 0 :(得分:3)
哇。你有两件事是错的。
如果该字段应该包含代码,请让它保存代码,而不是名称。像这样处理你的字段将导致无法读取和不可维护的代码。如果getCode()返回名称,getName()返回地址,getAddress()返回电话号码,你和你的同事将很快失去所有的头发。
联系人不应包含customerCode
类型的字段String
。它应该有customer
类型的字段Customer
,其中Customer
是代表客户的Hibernate实体。这称为关联。如果客户有多个联系人,则它是ManyToOne关联。如果只有一个,那就是OneToOne协会。这样,要获取客户的名称,您只需使用contact.getCustomer().getName()
。
您应该阅读Hibernate reference manual。
附注:不尊重Java naming conventions会使您的代码难以阅读。类名必须以大写字母开头,变量和方法必须以小写字母开头。它们都不应包含下划线(例如:ContactPersistence,jobTitle)
答案 1 :(得分:0)
对于仍然遇到同样问题的人来说,这是从开始到结束协助的链接。
http://levelup.lishman.com/hibernate/getting-started/index.php
对于初学者来说这是一篇很好的“一步一步”的文章。
然后,您可以转到休眠参考手册以获取更多详细信息。 (这就是我做的!!)