11

Tôi cần phải định cấu hình ngủ đông để tránh tạo hàng trùng lặp, (mặc dù hàng tồn tại nó tạo ra một hàng mới, và vì chỉ có một tệp được đặt nó đặt tất cả phần còn lại thành NULL)Làm cách nào để tránh tạo hàng mới nếu hàng tương tự tồn tại?

Cho phép nói rằng tôi có một hàng sau

id des index age 
1 MyName 2  23 

Mặc dù tôi chỉ cần đặt Myname như des và nó đã tồn tại trong bảng Tên ngủ đông tạo một hàng mới như sau

id des index age 
1 MyName 2  23 
2 MyName Null Null  << new row with null values will be created 
          rather than updating the previous one 

Khi tôi muốn sa . Vì vậy, tôi đã thêm chú thích sau vào lớp học của mình nhưng nó đã vượt qua thực thể và dynamicUpdate.

@org.hibernate.annotations.Entity(
    dynamicUpdate = true 
) 

Tôi cũng sử dụng @DynamicUpdate, mặc dù ngủ đông chấp nhận nhưng tôi vẫn gặp vấn đề tương tự.

Có phương pháp nào khác để làm điều đó không? Phiên bản của chế độ ngủ đông của tôi là như sau

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.2.1.Final</version> 
     <type>jar</type> 
</dependency> 

* Dựa trên nhận xét của Ray thổi, Bằng cách chỉ định một giá trị cho Id của lớp trẻ nó hoạt động đúng nhưng làm thế nào về nếu tôi không có ID? tôi có phải chọn lựa để tìm id trước không? Có phương pháp nào để buộc hibernate làm điều đó tự động r dựa trên giá trị của rahter lớp con hơn làm một lựa chọn riêng biệt để tìm id? *

User.Java

.... 
import org.hibernate.annotations.DynamicUpdate; 

@Entity 
@Table(name = "user") 
@DynamicUpdate 
public class User implements Serializable { 

    private int ID; 
    private Name name; 
    private String type; 

    public User() { 
    } 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    public int getID() { 
    return ID; 
    } 

    public void setID(int ID) { 
    this.ID = ID; 
    } 

    @ManyToOne(cascade = CascadeType.ALL) 
    public Name getName() { 
    return name; 
    } 

    public void setName(Name name) { 
    this.name = name; 
    } 

    ..... 

Name.Java

@Entity() 
@Table(name = "Name") 
public class Name implements Serializable { 

private int id; 
private String des; 
private String index; 
private String age; 

public Name() { 
} 

@Id 
@GeneratedValue 
@Column(name="id", unique= true, nullable = false) 
public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

..... 

Model.java

public void addMyUsers(){ 
    Name name = new Name(); 
    name.setDes("MyName"); 
    While(.....) 
    { 
     User user = new User(); 
     user.setName(name); 
     user.setType(X); 
     addUser(user); 
    } 
} 

public void addUser(User user) { 
     session = Util.getSession(); 

     session.beginTransaction(); 


     session.merge(user); 
     //session.saveOrUpdate(user); 

     session.getTransaction().commit(); 

     session.close(); 
} 
+2

Xem http://stackoverflow.com/q/8935975/1700321. –

+1

@AleksandrM cảm ơn tôi đã đọc rằng trước khi điều đó không đưa ra giải pháp vừa đề cập rằng các thẻ này không còn được dùng nữa. –

+0

Có thể bạn cũng cần đọc câu trả lời của câu hỏi đó. –

Trả lời

0

Bạn đã định cấu hình theo cách này chưa. Xin vui lòng chia sẻ mã ur nếu nó không theo cách này.

@Entity 
@Table(name = "example", catalog = "example_catalog") 
@org.hibernate.annotations.Entity(
     dynamicUpdate = true 
) 
+1

Như tôi đã đề cập trong câu hỏi, nó không hoạt động –

+0

bạn có thể chia sẻ mã số yêu cầu –

+0

câu hỏi được cập nhật –

6

mặc dù hàng tồn nó tạo ra một cái mới

Đó không phải là hoàn toàn đúng. Nó không chỉ hibernate tự động quyết định để tạo ra một người dùng mới. Hibernate là làm những gì mã của bạn nói với nó để:

  • Trong addMyUsers(), bạn tạo new Name()new User(), và bạn cung cấp không phải của các ID tồn tại trước đó. Bạn đã làm cho các đối tượng này trông giống như những đối tượng mới, thay vì những đối tượng đã tồn tại trước đó sẽ được cập nhật.
  • Trong addMyUser(), bạn gọi session.merge(user). Hibernate thấy các đối tượng không có ID - vì vậy nó kết hợp chúng và gán cho chúng trạng thái MỚI. Khi giao dịch được flushed & cam kết, hibernate tạo SQL để tạo ID mới và lưu trữ các đối tượng dưới dạng bản ghi mới.

Nếu bạn muốn xác định xem một đối tượng là tồn tại từ trước, và hoạt động trên kỷ lục trước đó nếu có thể:

  1. Lấy các lĩnh vực mà bạn muốn sử dụng (ví dụ như từ một mẫu web) - trong trường hợp của bạn, điều này bao gồm trường "det".
  2. Xem liệu bản ghi đã tồn tại trong cơ sở dữ liệu chưa. Truy xuất đối tượng bằng cách sử dụng chế độ ngủ đông qua session.find() hoặc session.get(), trong trường hợp của bạn bằng cách sử dụng trường "det".
  3. Nếu không thể tìm thấy đối tượng, thì tạo đối tượng mới.
  4. Đối với đối tượng đã truy xuất, bạn có thể tách đối tượng khỏi phiên trước khi sửa đổi, (ví dụ: qua session.clear()). Các đối tượng mới tạo đã ở trạng thái tách rời.
  5. Sửa đổi đối tượng (đặt trường của nó).
  6. Nếu đối tượng được tách ra, sau đó đính kèm qua session.merge(). Hợp nhất hoạt động cho cả hai đối tượng được tách ra từ trước (thu được thông qua truy xuất) và các đối tượng mới tách rời (thông qua new <Object>()). Ngoài ra, đối với các đối tượng tách rời đã tồn tại từ trước, bạn có thể gọi session.update() và đối với các đối tượng tách rời mới, bạn có thể gọi session.save()/persist().
  7. xóa/giao dịch.

Bạn đang thiếu (2).

+0

Câu hỏi được cập nhật vui lòng đọc phần in đậm nhờ –

+1

NP. Tôi đã trả lời phần táo bạo của bạn. Bạn không thể lấy ID ra khỏi "không khí mỏng". Bạn phải lấy nó (bước 2). –

+0

@GlenBest Cảm ơn câu trả lời của bạn nhưng tôi có một vấn đề khác tại http://stackoverflow.com/questions/17396586/how-to-prevent-hibernate-of-changing-fileds-to-null – J888

4

Khóa chính của nó đóng vai trò quan trọng ở đây. bạn nên sử dụng tên là khóa chính trong trường hợp này nhưng tôi sẽ không đề nghị bạn làm điều đó, lấy id làm khóa chính.

Cập nhật:

Cũng trong trường hợp cập nhật id nên cùng với các bản ghi bạn muốn cập nhật, nhưng trong trường hợp chèn, id nên được null và bạn sẽ nhận được nó lắp vào db.

trả lời với ý kiến ​​của bạn:

bạn cần phải lấy khóa chính và theo dõi nó theo cách này:

session.update(recordEntity);// or save 
    int id=recordEntity.getId(); 
2

bạn phải có được Tên đầu tiên, không mới Tên().

nên sử dụng trình đơn như "người sử dụng tìm kiếm"/thả xuống hoặc một cái gì đó cho người dùng lựa chọn Tên họ muốn, thì bạn có thể thêm rằng Tên để User.name mới

hoặc nếu bạn không muốn tìm kiếm Tên đầu tiên (từ không khí mỏng # lol), bạn không nên sử dụng User.name với loại Tên ở nơi đầu tiên, sử dụng chuỗi rồi. nhưng nó nguy hiểm hơn. và mối quan hệ không thể xây dựng theo cách đó (bạn phải truy vấn lại nếu bạn muốn nhận được Tên từ Người dùng có tên x).

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