Im mắc kẹt với vấn đề này. Lược đồ cơ sở dữ liệu được cung cấp bởi người khác vì vậy tôi không thể thay đổi tên. Tôi đã thử thêm ở mọi nơi chú thích thích hợp, có lẽ tôi đang thiếu một cái gì đó (hiển nhiên)?định danh oracle hibernate quá dài ORA-00972
Đây là bản đồ đầy đủ của tôi (khá nhiều lớp), tôi sẽ ommit getter/setters.
Vấn đề là khi ngủ đông đang cố gắng để có được tất cả các Rule List<ControlRuleAttrib> controlRuleAttribs
Controle
@Entity
@Table(name = "CONTROL_RULE")
public class ControlRule implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CONTROL_RULE_ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinColumn(name = "CONTROL_RULE_TYPE_ID")
@ForeignKey(name = "CONTROL_RULE_TYPE_ID")
private ControlRuleType controlRuleType;
@Column(name = "JOB_NM")
private String jobname;
@Column(name = "LIBRARY_NM")
private String libraryname;
@Column(name = "TABLE_NM")
private String tablename;
@Column(name = "COLUMN_NM")
private String columnname;
@OneToMany(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = {
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
})
private List <ControlRuleAttrib> controlRuleAttribs;
}
ControlRuleAttrib
@Table(name = "CONTROL_RULE_ATTRIB")
@Entity
public class ControlRuleAttrib {
@EmbeddedId
private ControlRuleAttribPK controlRuleAttribPK;
@Column(name = "ATTRIBUTE_VALUE")
private String attributeValue;
}
ControleRuleAttribPK 012.351.Câu hỏi ở đây là, có thể bằng cách nào đó có được Entity ControlRuleAttribType
từ ControlRuleAttrib
? Như bạn có thể thấy bên dưới ControlRuleAttribTypeId
là id của ControleRuleAttribType
. Tôi muốn nhận được toàn bộ đối tượng isteand của số nguyên.
@Embeddable
public class ControlRuleAttribPK implements Serializable {
@Column(name = "CONTROL_RULE_ID")
private Long controlRuleId;
@Column(name = "ATTRIBUTE_SEQ_NUM")
private Integer attributeSeqNum;
@Column(name = "CONTROL_RULE_ATTRIB_TYPE_ID")
private Integer controlRuleAttribTypeId;
}
ControleRuleAttribType
@Entity
@Table(name = "CONTROL_RULE_ATTRIB_TYPE")
public class ControlRuleAttribType implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CONTROL_RULE_ATTRIB_TYPE_ID")
private Integer id;
@Column(name = "CONTROL_RULE_ATTRIB_TYPE_NM")
private String typename;
@Column(name = "CONTROL_RULE_ATTRIB_TYPE_DESC")
private String typedesc;
@ManyToOne(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinColumn(name = "CONTROL_RULE_TYPE_ID")
@ForeignKey(name = "CONTROL_RULE_TYPE_ID")
private ControlRuleType controlruletype;
}
ControleRuleType
@Entity
@Table(name = "CONTROL_RULE_TYPE")
public class ControlRuleType implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CONTROL_RULE_TYPE_ID")
private Integer id;
@Column(name = "CONTROL_RULE_TYPE_NM")
private String typename;
@Column(name = "CONTROL_RULE_TYPE_DESC")
private String typedesc;
}
EDIT
Đây là stacktrace:
https://gist.github.com/a30dd9ce534d96bb9a97
Như bạn sẽ tìm hiểu, nó không thành công ở đây:
at com.execon.controllers.main.MainPageController.getMainPage(MainPageController.java:33) [classes:]
và đây là nó:
List<ControlRule> list = SessionFactoryUtils.openSession(
sessionFactory).createQuery("from ControlRule").list();
System.out.println(list);
mọi đối tượng mà bản đồ tôi nói thêm, có toString()
phương thức được khai báo như sau:
@Override
public String toString()
{
String s = "ControlRule{";
s += "id=" + id.toString();
s += ", controlRuleType=" + controlRuleType;
s += ", jobname='" + jobname + '\'';
s += ", libraryname='" + libraryname + '\'';
s += ", tablename='" + tablename + '\'';
s += ", columnname='" + columnname + '\'';
s += ", controlRuleAttribs=" + controlRuleAttribs;
s += '}';
return s;
}
Và ngủ đông yêu cầu:
https://gist.github.com/c8584113522757a4e0d8/4f31dc03e7e842eef693fa7ba928e19d27b3ca26
Trợ giúp xin vui lòng :)
EDIT 2
Vâng sau khi đọc @Jens câu trả lời, tôi đã làm một số thay đổi trong các mã. Trước tiên tôi đã làm như bạn đã viết và nó đã đưa ra lỗi:
org.hibernate.AnnotationException: A Foreign key refering com.execon.models.controlrules.ControlRuleAttrib from com.execon.models.controlrules.ControlRule has the wrong number of column. should be 3
Tôi đoán điều này đúng, vì tôi có khóa chính kết hợp.
Sau đó, tôi đã cố gắng nó theo cách này:
@OneToMany(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinTable(name = "CONTROL_RULE_ATTRIB",
joinColumns = {
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
},
inverseJoinColumns = {
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false),
@JoinColumn(name = "CONTROL_RULE_ATTRIB_TYPE_ID", nullable = false, updatable = false),
@JoinColumn(name = "ATTRIBUTE_SEQ_NUM", nullable = false, updatable = false)
})
private List<ControlRuleAttrib> controlRuleAttribs;
Khá gần nhưng nó mang lại cho tôi những ngoại lệ sau đây:
Repeated column in mapping for collection..
Vì vậy, cuối cùng tôi đã loại bỏ
joinColumns =
{
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
}
Và tất cả mọi thứ biên soạn trừ khi tôi cố gắng tiếp cận bộ sưu tập, Hibernate đang thực hiện truy vấn sau:
https://gist.github.com/c88684392f0b7a62bea5
Dòng cuối cùng, là controlrul0_.CONTROL_RULE_CONTROL_RULE_ID=?
trong khi nó phải được controlrul0_.CONTROL_RULE_ID=?
.
Có cách nào tôi có thể làm cho nó hoạt động không? :/
Xem chỉnh sửa của tôi, thêm stacktrace – kamil
Vì vậy, bạn đã gặp lỗi Oracle 'ORA-00972'. Nó được mô tả [ở đây] (http://www.techonthenet.com/oracle/errors/ora00972.php). Vấn đề là tên đối tượng DB dài, vì vậy chỉ có giải pháp mà tôi có thể đề xuất - rút ngắn tên. Có thể nhà cung cấp JPA tạo ra các bí danh rất dài, nhưng tôi nghĩ rằng tình trạng này gần như không thể (ngay cả khi các bí danh được tính đến). – gkuzmin
Đó là vấn đề:/Im viết nội dung cho công ty cung cấp cho chúng tôi lược đồ dữ liệu của riêng mình và không có gì tôi thực sự có thể làm với tên đối tượng – kamil