2011-07-28 32 views
7

Vấn đề của tôi là với các đối tượng bị tách rời ...Kiên trì một đối tượng trong Hibernate trong khi có khóa chính đã biết.

Tôi hiện đang sử dụng Spring with Hibernate.

Tôi có một đối tượng được ánh xạ có khóa chính dưới dạng Chuỗi (Tôi biết nó hút ... nhưng việc tái cấu trúc mã sẽ mất vài tháng) và tôi muốn duy trì nó. (Tôi đã đơn giản hóa các đối tượng chỉ với hai thuộc tính)

@Id 
private String id; 

private String pattern; 

Vì vậy, ví dụ tôi muốn thêm một cái gì đó như:

[ "id": "myFirstPattern", "mẫu": "*"]

Lưu ý rằng khóa chính của tôi đã được đặt. Vấn đề với điều đó là bất cứ khi nào tôi cố gắng tồn tại, Hibernate sẽ cố gắng liên kết đối tượng này với bất kỳ đối tượng nào trong ngữ cảnh (vì khóa chính) và sẽ không làm như vậy, vì không có. Ném một lỗi đối tượng tách ra.

Tôi đã thực hiện một số nghiên cứu và đi đến kết luận rằng hợp nhất() sẽ đủ nhu cầu của tôi, vì nó vẫn tồn tại và cập nhật ngay cả khi đối tượng không có sẵn. Tuy nhiên tôi thấy đây là một cách giải quyết khá dơ bẩn và muốn kiểm tra xem có giải pháp nào khác cho vấn đề này hay không.

Hãy xem xét rằng chúng tôi có một lớp Trình trợ giúp, do đó lớp Dịch vụ sẽ không hoạt động trực tiếp với lớp HibernateDao. Vì vậy, tôi có thể "mặt nạ" điều này bằng cách thêm các phương thức 'kiên trì' và 'cập nhật' sẽ gọi phương thức hợp nhất DAO.

Cảm ơn, Flavio.

+0

Hi Flavio, bạn có thể vui lòng đăng cấu hình lập bản đồ ngủ đông của bạn không? Bạn có thể xác nhận rằng bản đồ Hibernate của bạn hoạt động để lấy các đối tượng từ cơ sở dữ liệu không? – Caps

+0

org.hibernate.dialect.MySQL5Dialect xác nhận sai sai sai 0 net.sf. ehcache.hibernate.SingletonEhCacheProvider

+0

\t \t \t \t \t \t \t \t \t \t

Trả lời

1

Bạn đã thử saveOrUpdate chưa?

Session sess = factory.openSession(); 
Transaction tx; 
try { 
    tx = sess.beginTransaction(); 
    session.saveOrUpdate(yourObjectHere); 

    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 
+0

Tôi đã thử sử dụng SaveOrUpdate, nhưng tôi tin rằng cơ sở dữ liệu được lưu trong bộ nhớ cache của tôi lộn xộn với JUnit, vì tôi xóa một số dữ liệu theo cách thủ công thông qua truy vấn sql. Tôi tiếp tục nhận được lỗi StaleStateException khi tôi cố gắng để tồn tại cùng một đối tượng lần thứ hai sau khi tôi gỡ bỏ nó trong thử nghiệm trước đây. Không chắc rằng chúng tôi sẽ làm bất kỳ loại bỏ thủ công nào, nhưng đó vẫn là lý do tại sao JUnits có mặt ở đó, để kiểm tra mọi thứ. –

0

Tôi không chắc chắn và hiện tại tôi không thể tự mình thử nghiệm, nhưng không đặt thuộc tính @Id để sử dụng trình phát "assigned" làm chính xác điều đó?

+0

Không thể tìm thấy bất kỳ cụ thể nào trong @Id, mặc dù tôi đã tìm thấy những người khác trong GeneratedId, v.v. ... Không chắc chắn điều này sẽ giúp tôi như thế nào. Các chiến lược GeneratedValue có liên quan đến DB phải không? Tôi đã làm việc với những điều này trước đây, nhưng tất cả kinh nghiệm trước đó của tôi là với DBs chuẩn hóa ... –

1

Tôi đã thử sử dụng một số cách tiếp cận khác sau khi tôi đã thử ý tưởng mà Mauricio đưa cho tôi. Vì SaveOrUpdate đã sử dụng các thực thể được lưu trong bộ nhớ cache để xác minh xem nó có nên cập nhật hoặc lưu một đối tượng mà tôi đã nghĩ về việc làm rõ trước khi lưu đối tượng của mình hay không.

như vậy, đây là mảnh của tôi mã:

try { 
     getHibernateTemplate().clear(); 
     getHibernateTemplate().save(entity); 
    } catch (DataAccessException e) { 
     if (e.getCause() instanceof ConstraintViolationException) 
      throw new HibernateDaoException("Entity could not be persisted. Constraint violation."); 
     throw new HibernateDaoException(e); 
    } 

Còn bây giờ, nó đang làm việc như mong đợi, mặc dù có vẻ như nó sẽ giết chết lý do cơ sở dữ liệu lưu trữ của tôi để tồn tại ... Tuy nhiên tính năng cập nhật này sẽ được sử dụng một cách tiết kiệm, vì lý do chính cho thành phần là trả về thông tin, các mẫu phù hợp và trả lại kết quả tốt nhất.

Dù sao tôi sẽ sớm quay lại nếu tôi tìm thấy bất kỳ sai sót nào.

Mọi nhận xét, vui lòng đăng chúng :)

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