Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để tạo một lớp mô hình thực thể chung hỗ trợ id chung bao gồm id được tạo tự động?

Không thử điều này, nhưng theo api của Hibernate, điều này không phức tạp bằng cách tạo triển khai tùy chỉnh của IdentityGenerator .

Đó là phương thức tạo được và đối tượng mà bạn đang tạo giá trị để bạn có thể kiểm tra loại trường id và trả về giá trị thích hợp cho khóa chính của mình.

public class DynamicGenerator  implements IdentityGenerator

        public Serializable generate(SessionImplementor session, Object object)
                throws HibernateException {

             if (shouldUseAutoincrementStartegy(object)) { // basing on object detect if this should be autoincrement or not, for example inspect the type of id field by using reflection - if the type is Integer use IdentityGenerator, otherwise another generator 
                 return new IdentityGenerator().generate(seession, object)
             } else { // else if (shouldUseTextKey)

                 String textKey = generateKey(session, object); // generate key for your object

                 // you can of course connect to database here and execute statements if you need:
                 // Connection connection = session.connection();
                 //  PreparedStatement ps = connection.prepareStatement("SELECT nextkey from text_keys_table");
                 // (...)

                 return textKey;

            }

        }
    }

Có điều này chỉ cần sử dụng nó làm chiến lược tạo của bạn:

@MappedSuperclass
public abstract class BaseEntity<T> implements Serializable {
    @Id
    @GenericGenerator(name="seq_id", strategy="my.package.DynamicGenerator")
    protected T id;
}

Đối với Hibernate 4, bạn nên triển khai IdentifierGenerator giao diện.

Như ở trên được chấp nhận cho Hibernate, vẫn có thể tạo nó theo cách chung chung hơn cho bất kỳ nhà cung cấp "tuân thủ jpa" nào. Theo JPA api trong GeneratedValue chú thích mà bạn có thể cung cấp trình tạo tùy chỉnh của mình. Điều này có nghĩa là bạn có thể cung cấp tên của trình tạo tùy chỉnh của mình và bạn nên triển khai trình tạo này cho từng nhà cung cấp jpa.

Điều này có nghĩa là bạn cần chú thích BaseEntity bằng chú thích sau

@MappedSuperclass
public abstract class BaseEntity<T> implements Serializable {
    @Id
    @GeneratedValue(generator="my-custom-generator")
    protected T id;
}

Bây giờ bạn cần đăng ký trình tạo tùy chỉnh với tên "my-custom-browser" cho mỗi nhà cung cấp jpa mà bạn muốn sử dụng.

Đối với Hibernate, điều này hoàn toàn được thực hiện bởi chú thích @GenericGenerator như được hiển thị trước (thêm @GenericGenerator(name="my-custom-generator", strategy="my.package.DynamicGenerator" thành BaseEntity lớp trên id trường hoặc BaseEntity cấp độ lớp phải đủ).

Trong EclipseLink, tôi thấy rằng bạn có thể thực hiện việc này qua GeneratedValue chú thích và đăng ký nó qua SessionCustomizer:

            properties.put(PersistenceUnitProperties.SESSION_CUSTOMIZER,
                    "my.custom.CustomIdGenerator");

public class CustomIdGenerator extends Sequence implements SessionCustomizer {


    @Override
    public Object getGeneratedValue(Accessor accessor,
            AbstractSession writeSession, String seqName) {
        return  "Id"; // generate the id
    }

    @Override
    public Vector getGeneratedVector(Accessor accessor,
            AbstractSession writeSession, String seqName, int size) {
        return null;
    }

    @Override
    protected void onConnect() {
    }

    @Override
    protected void onDisconnect() {
    }

    @Override
    public boolean shouldAcquireValueAfterInsert() {
        return false;
    }

    @Override
    public boolean shouldOverrideExistingValue(String seqName,
            Object existingValue) {
        return ((String) existingValue).isEmpty();
    }

    @Override
    public boolean shouldUseTransaction() {
        return false;
    }

    @Override
    public boolean shouldUsePreallocation() {
        return false;
    }

    public void customize(Session session) throws Exception {
        CustomIdGenerator sequence = new CustomIdGenerator ("my-custom-generator");

        session.getLogin().addSequence(sequence);
    }

}    

Mỗi nhà cung cấp phải cung cấp một cách để đăng ký trình tạo id, vì vậy bạn sẽ cần triển khai và đăng ký chiến lược tạo tùy chỉnh cho từng nhà cung cấp nếu bạn muốn hỗ trợ tất cả chúng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách hàm OCT () hoạt động trong MySQL

  2. Truy vấn MYSQL sử dụng biến làm tên bảng trong LEFT JOIN

  3. Cách CHỌN dựa trên giá trị của một CHỌN khác

  4. Bạn có thể sử dụng các giá trị tổng hợp trong ON DUPLICATE KEY không

  5. Phát triển Rails - Không thể kết nối với máy chủ MySQL trên 'localhost' (10061)