Tôi đang gặp sự cố khi ánh xạ thuộc tính được nhúng của một lớp. Tôi đã tạo ra một số lớp học tương tự như những gì tôi đang cố gắng làm để minh họa. Về cơ bản, tôi có một hệ thống phân cấp lớp @Embeddable sử dụng Thừa kế. Lớp cấp cao nhất "Part Number" chỉ có một thuộc tính, và các lớp mở rộng thêm không có thuộc tính cho lớp "Part Number", chúng chỉ thêm một số validation/logic.JPA/Hibernate - Nhúng một thuộc tính
Dưới đây là những gì tôi có nghĩa là:
PHẦN
@Entity
@Table(name="PART")
public class Part {
private Integer id;
private String name;
private PartNumber partNumber;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="PART_NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Embedded
public PartNumber getPartNumber() {
return partNumber;
}
public void setPartNumber(PartNumber partNumber) {
this.partNumber = partNumber;
}
}
số Part
@Embeddable
public abstract class PartNumber {
protected String partNumber;
private String generalPartNumber;
private String specificPartNumber;
private PartNumber() {
}
public PartNumber(String partNumber) {
this.partNumber = partNumber;
}
@Column(name = "PART_NUMBER")
public String getPartNumber() {
return partNumber;
}
public void setPartNumber(String partNumber) {
this.partNumber = partNumber;
}
/**
* @param partNumber
* @return
*/
public boolean validate(String partNumber) {
// do some validation
return true;
}
/**
* Returns the first half of the Part Number
*
* @return generalPartNumber
*/
@Transient
public String getGeneralPartNumber() {
return generalPartNumber;
}
/**
* Returns the last half of the Part Number
* which is specific to each Car Brand
*
* @return specificPartNumber
*/
@Transient
public String getSpecificPartNumber() {
return specificPartNumber;
}
}
FORD số Part
public class FordPartNumber extends PartNumber {
/**
* Ford Part Number is formatted as 1234-#1234
*
* @param partNumber
*/
public FordPartNumber(String partNumber) {
super(partNumber);
validate(partNumber);
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#validate(java.lang.String)
*/
@Override
public boolean validate(String partNumber) {
// do some validation
return true;
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#getGeneralPartNumber()
*/
@Override
public String getGeneralPartNumber() {
return partNumber;
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#getSpecificPartNumber()
*/
@Override
public String getSpecificPartNumber() {
return partNumber;
}
}
CHEVY số Part
public class ChevyPartNumber extends PartNumber {
/**
* Chevy Part Number is formatted as 1234-$1234
*
* @param partNumber
*/
public ChevyPartNumber(String partNumber) {
super(partNumber);
validate(partNumber);
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#validate(java.lang.String)
*/
@Override
public boolean validate(String partNumber) {
// do some validation
return true;
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#getGeneralPartNumber()
*/
@Override
public String getGeneralPartNumber() {
return partNumber;
}
/*
* (non-Javadoc)
*
* @see com.test.PartNumber#getSpecificPartNumber()
*/
@Override
public String getSpecificPartNumber() {
return partNumber;
}
}
Tất nhiên điều này không làm việc, bởi vì Hibernate bỏ qua các thừa kế Hierarchy và không thích thực tế là số Part là trừu tượng. Có cách nào để thực hiện điều này bằng cách sử dụng chú thích JPA hoặc Hibernate? Tôi đã thử sử dụng chú thích @Inheritance JPA.
Tôi không thể cấu trúc lại phần "PartNumber" của phân cấp vì Nhà phát triển ban đầu muốn có thể mở rộng PartNumber bằng nhiều lớp XXXXPartNumber.
Có ai biết nếu bất cứ điều gì như thế này sẽ là một phần của JPA 2.0 hoặc phiên bản Hibernate mới không?
Dành cho B, bạn có biết của bất kỳ hướng dẫn tốt cho marshalling/unmarshalling lớp con thích hợp bằng cách sử dụng một kiểu ngủ đông tùy chỉnh? – systemoutprintln
Bạn chỉ cần triển khai giao diện UserType của Hibernate - nó khá đơn giản. Đây là một ví dụ từ tài liệu Hibernate: (https://www.hibernate.org/172.html). Trong trường hợp của bạn, bạn sẽ trả về PartNumber từ phương thức "returnClass()" và tự động khởi tạo lớp con thích hợp trong "nullSafeGet()" dựa trên giá trị bạn lưu trữ trong một cột (và lấy từ ResultSet). – ChssPly76