gpt4 book ai didi

hibernate - org.hibernate.exception.SQLGrammarException : could not initialize a collection

转载 作者:行者123 更新时间:2023-12-03 08:11:01 25 4
gpt4 key购买 nike

我有 3 个表 tbl_category 、 tbl_Advertisment 和 tbl_linkcategoryadvert (有很多对多关联黑白类别和广告)

我的 POJO 如下所示

广告.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;
}
}

分类.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 - 主类
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

我没有提供 DAO.java,因为它只包含 Hibernate 样板代码。

当我运行主类时,出现以下异常:
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)

请帮帮我....

我的表看起来像:

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)

现在我的问题是...
  • 我是否为表“link_categoryadvert”中的字段取了错误的名称?
  • Hibernate 如何查找列名和映射?
  • @JoinTable 注释的其他可能属性是什么?
  • 最佳答案

    Hibernate 正在为您的连接列生成列名称“categories_id”,其中您的表使用名称“category_id”。引用指南有一个例子 how to map a many-to-many relationship .周围的文本中也有几个相关的细节。您应该只需要使 Category.getAdverts() 上的映射看起来像:

    @JoinTable(
    name="tbl_linkcategoryadvert",
    joinColumns=@JoinColumn(name="category_id"),
    inverseJoinColumns=@JoinColumn(name="advert_id")
    )

    关于hibernate - org.hibernate.exception.SQLGrammarException : could not initialize a collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706094/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com