2010-10-28 47 views
7

Tôi muốn lưu một số Đối tượng vào cơ sở dữ liệu với các ID được xác định trước bằng Hibernate. Có thể làm điều đó bằng cách sử dụng phương pháp lưu của phiên Hibernate?Lưu đối tượng mới với Hibernate bằng cách sử dụng ID được cung cấp

Tôi biết có những cách giải quyết như sau:

1) thực hiện lệnh SQL với báo cáo chèn cần thiết:

insert into MyObj(id,name) values (100,'aaa'), (101,'bbb'); 

2) sử dụng truy vấn SQL trong Hibernate:

public static boolean createObj(Long id, String name) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    if (session.get(MyObj.class, id) == null) {   
    session.beginTransaction(); 
    SQLQuery sqlQuery = session.createSQLQuery 
     ("insert into myobj(id,name) values(?,?)"); 
    sqlQuery.setLong(0, id); 
    sqlQuery.setString(1, name); 
    sqlQuery.executeUpdate(); 
    session.getTransaction().commit(); 
    return true; 
    } else { 
    return false; 
    } 
} 

Nhưng: là nó có thể làm mà không có SQLQuery?

Trong Hibernate tài liệu tham khảo trong phần 11.2. Making objects persistent có ví dụ về mã:

Ngoài ra, bạn có thể gán các định danh sử dụng phiên bản quá tải của save().

DomesticCat pk = new DomesticCat(); 
pk.setColor(Color.TABBY); 
pk.setSex('F'); 
pk.setName("PK"); 
pk.setKittens(new HashSet()); 
pk.addKitten(fritz); 
sess.save(pk, new Long(1234)); 

Nhưng tôi không thể tìm thấy ví dụ về cách thực hiện việc này.

Vì vậy, có thể lưu các đối tượng mới với ID được cung cấp vào cơ sở dữ liệu với Hibernate không sử dụng truy vấn SQL không? Nếu có thì làm thế nào? Và làm thế nào để quá tải phiên phương pháp tiết kiệm() như đã đề cập trong tài liệu tham khảo Hibernate?

Cảm ơn!

Trả lời

4

Tài liệu yêu cầu bạn không ghi đè save mình, nhưng để sử dụng biến thể của save có hai đối số. Xem [JavaDocs] [1] để biết thêm chi tiết.

YourEntity entity = // .. 
entity.setFoo(foo); 
entity.setBar(bar); 
//.. 
session.save(entity, theIDYouWantToUse); 

[1]: http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Session.html#save(java.lang.String, java.lang.Object)

+1

Đừng quên không sử dụng máy phát điện ID khi sử dụng hai tham số ' save' –

+1

Eh, liên kết phù hợp là: http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/classic/Session.html#save(java.lang.Object, java.io. Serializable) – iryndin

+2

Biến thể duy nhất của 'Save()' bằng cách sử dụng hai args nhận một chuỗi và sau đó đối tượng chính nó ... không phải là một khóa. – Nyerguds

4

Sử dụng session.replicate

YourEntity entity = // .. 
entity.setId(yourId); 
entity.setBar(bar); 
//.. 
session.replicate(entity,ReplicationMode.EXCEPTION); 
1

Chỉ định assigned như máy phát điện trên cột ID.

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-id-generator

Lưu ý rằng đối này để thực hiện tốt, nó sẽ giúp bạn có một nullable phiên bản sở hữu. Hibernate sau đó xử lý các giá trị phiên bản 'null' như chưa được lưu.

<id name="id" type="int"> 
    <generator class="assigned" /> 
</id> 
<version name="version" type="int"> 

public class Person { 
    // ID; assigned, SPEC. 
    public int getId(); 
    public void setId (int id); 
    // Version; NOTE -- must be nullable! 
    public Integer getVersion(); 
    public void setVersion (Integer version); 
} 

Hy vọng điều này sẽ hữu ích.

0

Hiện tại, replicate(Object object, ReplicationMode replicationMode) có vẻ là một cách được chấp nhận và được ưu tiên. Bạn có thể muốn chơi một chút với các giá trị khác nhau cho ReplicationMode cho phù hợp với nhu cầu của bạn.

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