2012-07-10 25 views
5

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? :/

Trả lời

2

Xem Sau khi vật lộn với điều này trong vài giờ qua cuối cùng tôi làm cho nó làm việc trong dự án của tôi. Điều tôi đã làm được điều này:

ControlRule

@OneToMany(fetch = FetchType.LAZY, mappedBy = "controlRuleAttribPK.controlRuleId") 
@Cascade(CascadeType.ALL) 
private List<ControlRuleAttrib> controlRuleAttribs; 

Về cơ bản chỉ là bộ sưu tập nên sử dụng controlRuleId từ khóa chính composite. Cho đến nay nó hoạt động rất tốt!

0

Tôi không hiểu rõ số nhận dạng nào quá dài, nhưng tôi có thể đề xuất bạn có thể thử thay đổi @Id loại trường được chú thích từ Integer thành Long. Và nó sẽ là tuyệt vời để có được một số thông tin chi tiết (stack dấu vết vv) về vấn đề của bạn.

+0

Xem chỉnh sửa của tôi, thêm stacktrace – kamil

+0

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

+0

Đó 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

0

Vấn đề là cột

CONTROL_RULE_ATTRIB.controlRuleAttribs_CONTROL_RULE_ATTRIB_TYPE_ID 

Đó là quá lâu nó có thể không có khả năng tồn tại trong cơ sở dữ liệu của bạn. Tôi không thấy trong câu hỏi bất kỳ gợi ý nào được đặt tên như thế nào, nhưng tôi giả định rằng tên riêng là

CONTROL_RULE_ATTRIB.CONTROL_RULE_ATTRIB_TYPE_ID 

Vì vậy, câu hỏi đặt ra là: Tại sao hibernate cố truy cập cột này. Bảng nó là trong là một bảng vẽ bản đồ được ánh xạ trong ngủ đông như:

@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; 

Nếu bạn nhìn vào chú thích @JoinTable bạn sẽ nhận thấy rằng nó xác định tên bảng vì nó được sử dụng và một cột tham gia. Nhưng một bảng ánh xạ có hai bộ cột nối. Thứ hai trên không được chỉ định. Do đó các NamingStrategy bạn cấu hình hoặc nếu bạn không cấu hình bất kỳ mặc định được sử dụng. Chỉ cần chỉ định một tập hợp các cột kết nối khác sử dụng thuộc tính inverseJoinColumns và tất cả sẽ ổn.

Chú thích hoàn chỉnh nên hình như:

@JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = {@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)}, inverseJoinColumns = {@JoinColumn(name = "CONTROL_RULE_ATTRIB_TYPE_ID")}) 

Lưu ý: Tôi không có ý tưởng nếu bạn cần bất kỳ thứ nullable, có thể cập nhật trên cột đó là tốt.

cũng là documentation of the JoinTable annotation

+0

Tôi đã chỉnh sửa theo đề xuất của bạn, vui lòng xem bài đăng đã chỉnh sửa của tôi – kamil

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