Tôi có 3 bảng tbl_category, tbl_Advertisment và tbl_linkcategoryadvert (có nhiều để nhiều hiệp hội b/w loại & QUẢNG CÁO)org.hibernate.exception.SQLGrammarException: không thể khởi tạo một bộ sưu tập
My POJO như đưa ra dưới đây
Advertisment.java
@Entity
@Table(name="tbl_advertisment")
public class Advertisment implements Serializable {
private long id;
private String title;
private String message;
private Set<Category> categories;
public Advertisment(String title, String message) {
this.title = title;
this.message = message;
this.categories=new HashSet<Category>();
}
protected Advertisment() {
}
@Id
@GeneratedValue
protected long getId() {
return id;
}
protected void setId(long id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Column(nullable=false)
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@ManyToMany(mappedBy="adverts")
public Set<Category> getCategories() {
return categories;
}
public void setCategories(Set<Category> categories) {
this.categories = categories;
}
}
Category.java
@Entity
@Table(name="tbl_category")
public class Category implements Serializable {
private long id;
private String title;
private Set<Advertisment> adverts=new HashSet<Advertisment>();
public Category(String title) {
this.title = title;
}
protected Category() {
}
@ManyToMany
@JoinTable(name="tbl_linkcategoryadvert")
public Set<Advertisment> getAdverts() {
return adverts;
}
public void setAdverts(Set<Advertisment> adverts) {
this.adverts = adverts;
}
public void addAdvert(Advertisment advert){
adverts.add(advert);
}
@Id
@GeneratedValue
protected long getId() {
return id;
}
protected void setId(long id) {
this.id = id;
}
@Column(unique=true,nullable=false)
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
PostAdvert.java - lớp Main
public class PostAdvertisment extends DAO{
public Advertisment post(String username,String catTitle,String title,String message)
throws DAOException {
try{
begin();
Query categoryQuery=getSession().createQuery("from Category where title=:categoryTitle");
categoryQuery.setString("categoryTitle", catTitle);
Category category=(Category)categoryQuery.uniqueResult();
Advertisment advert=new Advertisment(title,message,user);
getSession().save(advert);
category.addAdvert(advert);
getSession().save(category);
commit();
return advert;
} catch(HibernateException he){
he.printStackTrace();
throw new DAOException(he.getMessage());
}
}
public static void main(String[] args){
String catTitle="LCD";
String title="Bravia";
String message="High Contrast Television";
try{
PostAdvertisment post=new PostAdvertisment();
post.post(username, catTitle, title, message);
DAO.close();
} catch(DAOException daoEx){
System.out.println(daoEx.getMessage());
}
}
}
DAO.java
tôi không cung cấp DAO.java vì nó chỉ chứa mã boilerplate Hibernate.
Khi tôi chạy lớp chính tôi nhận được sau ngoại lệ:
SEVERE: Unknown column 'adverts0_.categories_id' in 'field list'
org.hibernate.exception.SQLGrammarException: could not initialize a collection: [hibernate.Category.adverts#3]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2001)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
at org.hibernate.collection.PersistentSet.add(PersistentSet.java:189)
at hibernate.Category.addAdvert(Category.java:48)
at hibernate.client.PostAdvertisment.post(PostAdvertisment.java:35)
at hibernate.client.PostAdvertisment.main(PostAdvertisment.java:56)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'adverts0_.categories_id' in 'field list'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.Util.getInstance(Util.java:384)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
Xin vui lòng giúp tôi ra ....
Bàn của tôi trông giống như:
1. tbl_advert
id PK BIGINT
title VARCHAR(255)
2. tbl_category
id PK BIGINT
title VARCHAR(255)
3. tbl_linkcategoryadvert
advert_id FK references(advert.id)
category_id FK references(category.id)
Bây giờ câu hỏi của tôi là ...
- Am i dùng tên sai cho các trường trong bảng "link_categoryadvert "?
- cách hibernate tìm kiếm các tên cột & ánh xạ?
- các thuộc tính có thể có khác cho Chú thích @JoinTable là gì?
làm các khóa ngoài trong bảng tham gia của bạn tbl_linkcategoryadvert có tên categories_id và advertisments_id? Nếu không, bạn có thể phải định cấu hình ánh xạ @JoinTable của mình để phản ánh các tên đó. –
Bạn có thể nói là bảng quảng cáo trông như thế nào? Có lẽ bạn cần xác định cột nhiều thành phần, ví dụ: '@ JoinTable (name =" adverts ", joinColumns = @ JoinColumn (name =" cat_id "))'? –
Vui lòng chỉ chỉnh sửa câu hỏi của bạn trong tương lai để cung cấp thêm chi tiết. Ngoài ra, hãy kiểm tra liên kết trợ giúp định dạng trong trình chỉnh sửa. –