2017-03-19 16 views
7

Tôi có mã kế thừa mà tôi đang cố gắng ánh xạ tới mã mới.Lập bản đồ Hibernate cho các phép nối phức tạp

OLD_PERSON 
pid 
sid 
name 
age 

NEW_PERSON 
pid 
sid 
fid 
age 

RESOLVE_PERSON 
pid 
fid 
status 

Java lớp

domain.Person { 
ID _id; 
String _name; 
Integer _age; 
} 

Trong thế giới di sản, chỉ có một bảng: OLD_TABLE. Lập bản đồ ngủ đông rất đơn giản, chỉ một lớp và các cột của nó. Trong thế giới mới, tôi phải sử dụng 3 bảng trên và tạo một Thực thể có tên đến từ OLD_PERSON và tuổi từ NEW_PERSON. Vì vậy, về cơ bản một truy vấn SQL là:

select op.name as name, np.age as age 
from OLD_PERSON op 
INNER JOIN RESOLVE_PERSON rp 
on rp.pid = op.pid 
INNER JOIN NEW_PERSON np 
on np.pid = rp.pid and np.fid = rp.fid and np.sid = op.sid 
where rp.status = 'CURRENT' 

Khi nghiên cứu/googling tôi thấy rằng tôi có thể sử dụng "Bảng phụ" tương đương với "JOIN table" trong ngủ đông xml. Lưu ý: Tôi không thể sử dụng chú thích vì mã này cũ và tôi vẫn ở chế độ ngủ đông.

Vì vậy, tôi đã thêm một bảng tham gia bên trong tập tin bản đồ của tôi:

<class name="domain.Person" table="OLD_PERSON"> 
     <composite-id name="_id" class="Id"> 
      <key-property access="property" name="key1" type="long" column="pid" /> 
      <key-property access="property" name="key2" type="int" column="sid" /> 

      <generator class="assigned" /> 
     </composite-id> 

     <property name="_Name" type="String" column="name" /> 

     <join table="NEW_PERSON" fetch="join" inverse="false"> 
      <key> 
      <column name="pid" /> 
      <column name="sid" /> 
      </key> 
      <property name="_age" column="age" not-null="true" /> 
     </join> 
</class> 

Nhưng tham gia vào NEW_PERSON bảng đòi hỏi một bên tham gia với RESOLVE_PERSON bảng. Tôi đã thử sử dụng subselect nhưng không phải là điều đúng để sử dụng. Tôi không thể cắm vào công thức ở bất kỳ đâu tại đây.

Mọi gợi ý về cách thức này có thể đạt được? Những gì tôi về cơ bản yêu cầu là làm thế nào để áp dụng một tiêu chí/ràng buộc kiểm tra trên JOIN.

Trả lời

1

Tôi gặp phải tình huống tương tự như sự cố của bạn. Tôi đã ánh xạ bảng thứ ba đến một thực thể và sử dụng DAO cho thực thể này để lấy một cái gì đó bằng thuộc tính của nó.

Đây là mã (kể từ khi tôi đã sử dụng chú thích, vì vậy đây không phải là một cái gì đó bạn có thể sử dụng trực tiếp, nhưng hy vọng nó sẽ cung cấp cho bạn một số cảm hứng),

@Entity 
@Table(name = "resolve_person") 
public class ResolvePerson implements java.io.Serializable { 
    private OldPerson old; 
    private NewPerson new; 

    ... 

    @ManyToOne // you may change it to other relationships 
    @JoinColumn(name = "pid", nullable = false) 
    public OldPerson getOldPerson() { 
     return this.old; 
    } 

    public void setOldPerson (OldPerson old) { 
     this.old = old; 
    } 

    @Id 
    @GeneratedValue(generator = "idGenerator") 
    @GenericGenerator(name = "idGenerator", strategy = "foreign", 
      parameters = { @org.hibernate.annotations.Parameter(name = "property", value = "fid") }) 
    @Column(name = "fid", nullable = false, unique = true) 
    public NewPerson getNewPerson() { 
     return this.New; 
    } 

    public void setNewPerson (NewPerson new) { 
     this.new = new; 
    } 
} 

Các DAO là hoàn toàn bình thường,

public List findByProperty(String propertyName, Object value) { 
     log.debug("finding ResolvePerson instance with property: " 
       + propertyName + ", value: " + value); 
     try { 
      String queryString = "from ResolvePerson as model where model." 
        + propertyName + "= ?"; 
      Query queryObject = getSession().createQuery(queryString); 
      queryObject.setParameter(0, value); 
      return queryObject.list(); 
     } catch (RuntimeException re) { 
      log.error("find by property name failed", re); 
      throw re; 
     } 
    } 

Bây giờ bạn có thể truy vấn với thuộc tính "trạng thái" được đặt thành "hiện tại".

Các vấn đề liên quan