在另一个模型中获取模型列表的正确方法

时间:2015-01-18 11:11:59

标签: java database hibernate

我正在开发一个spring mvc app,其中有2个实体,联系人和位置。以下是我的联系方式和位置模型:

@Entity
@Table(name="Contact")
public class ContactModel {

    @Id
    @Column(name="contactid")
    @GeneratedValue
    private int contactId;

    @Column(name="contactname")
    private String contactName;

    @Column(name="contactemail")
    private String email;

    @Column(name="contactphone")
    private String phone;

    @Column(name="locationid")
    private int locationId;
}

位置模型:

@Entity
@Table(name="Location")
public class LocationModel {

    @Id
    @Column(name="locationid")
    @GeneratedValue 
    private int locationId;

    @Column(name="locationname")
    private String locationName;

    @Column(name="locationdesc")
    private String locationDescription;

    @Column(name="type")
    private String locationType;

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

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

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

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

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

    @Column(name="longitude")
    private String longitude;
}

在联系人dao中,我使用以下代码获取联系人列表:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(ContactModel.class);
criteria.addOrder(Order.asc("contactName"));
return criteria.list();

现在我需要在联系主页上显示联系人列表,其中会显示联系人姓名及其相应的位置名称。

要显示联系人列表,我需要在联系人和位置表中创建联接。这是正确的方法吗?我们怎么能在休眠中做到这一点?

这也是在联系人实体中添加位置实体的正确方法,还是我必须在联系中使用位置模型?

2 个答案:

答案 0 :(得分:1)

你必须将你的两个实体与关系联系起来。我假设ContactModel与LocationModel有一对一的关系

将您的ContactModel更改为

@Entity
@Table(name="Contact")
public class ContactModel {

    @Id
    @Column(name="contactid")
    @GeneratedValue
    private int contactId;

    @Column(name="contactname")
    private String contactName;

    @Column(name="contactemail")
    private String email;

    @Column(name="contactphone")
    private String phone;

    @OneToOne
    @Column(name="locationid")
    private LocationModel location;
}

并执行与您正在执行的相同操作,仅选择ContactModel List对象。

public List<ContactModel> allContactModel(){  
          Session session = sessionFactory.getCurrentSession();
          Criteria criteria =  session.createCriteria(ContactModel.class);
          criteria.addOrder(Order.asc("contactName"));
          return criteria.list();
}

并通过迭代列表ContactModel获取控制器中的位置值,并在通过ClassName.Fieldname.Here获取正常变量时从ContactModel获取LocationModel对象它将为您提供LocationModel对象

List<ContactModel> mylist=ContactModel.allContactModel();
for(ContactModel cm: mylist){
   LocationModel lm=ContactModel.getLocationModel();
   System.out.println(cm.getContactName+" location is "+lm.getLocationName);
}

现在你有了LocationModel,你也可以获取更多的值。

您还可以通过根据您的要求指定fetchtype,cascadetype等来进一步增强此onetoone关系。 注意:假设你的模型中有getter和setter

答案 1 :(得分:0)

我认为正确的方法是联系人可以拥有一个位置,现在为您的联系人添加一个位置对象,如下所示:

@Entity
@Table(name="Contact")
public class ContactModel {

    ...

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "locationid", nullable = false)
    private LocationModel location;

    // can be removed
    @Column(name="locationid")
    private int locationId;
    ...

}

如果你有这个,你在拨打联系人记录时会得到位置对象