【问题标题】:Hibernate insert with single column table problemHibernate插入单列表问题
【发布时间】:2011-09-26 23:55:07
【问题描述】:

我正在使用带有 SQLite 数据库的 Hibernate。我有以下课程:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Authority {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int idAuthority;
(...)

然后我有一个 Author 类,它扩展了 Authorization 并添加了 4 或 5 个字段。 当我尝试保存 Author 对象时,Hibernate 会生成以下请求:

 Hibernate: insert into Authority values ( )

而 sqlite 不喜欢这样。

如果我添加一个虚拟字符串字段,如“私有字符串测试”并在构造函数中设置此属性,一切正常。

我对休眠很陌生,所以我不确定如何继续。你有什么想法吗?

编辑:根据要求,作者类的映射:

@Entity
@Table(name="Authors")
@PrimaryKeyJoinColumn(name="idAuthority")
public class Author extends Authority {

    @Column(name = "firstName")
    protected String firstName;
    @Column(name = "lastName")
    protected String lastName;
    @Column(name = "alias")
    protected String alias;
(...)
}

编辑:根据要求(之二),插入代码:

public void save(Object data) {
     currentSession.saveOrUpdate(data);
}

没什么特别的... 为了给你更多可能的线索,这里是数据库模式:

create table Authority (idAuthority  integer, primary key (idAuthority))
create table Authors (alias varchar, firstName varchar, 
lastName varchar, idAuthority bigint not null, primary key (idAuthority))

注意: 在 SQLite 中,作为主键的整数会自动设置为 AUTO-INCREMENT。

引发的异常是这个:

java.sql.SQLException: near ")": syntax error

请求应该更像:插入权限值(NULL)以让 SQLite 进行自动增量,而不是这种奇怪的“插入权限值()”。

编辑:这绝对是 SqlLite for Hibernate 包的问题。我刚刚尝试使用 Hsqldb,它给了我一个正确的查询:

insert into Authority (idAuthority) values (default)

(然后它也失败了,但原因非常不同:p)。

我不确定这个问题是否有解决方案...除了使用不同的数据库。

【问题讨论】:

  • 贴上作者的映射,方便大家看到,谢谢
  • 你能不能把idAuthority设为公开(在课堂上Authority)?
  • @Santosh :试过了,但没用。
  • 添加insert的示例代码,没有思路

标签: java hibernate sqlite


【解决方案1】:

如果您使用InheritanceType.JOINED,则与权威类关联的表必须包含与 idAuthority 关联的列,并且与类 Author 关联的表必须包含与 idAuthority 关联的列,idAuthority 是表示权威的表中主标识符的外键。表关系关联需要它

【讨论】:

    【解决方案2】:

    尝试覆盖 ID。

    @Entity
    @Table(name="Authors")
    @PrimaryKeyJoinColumn(name="idAuthority")
    @AttributeOverride(name="idAuthority", column=@Column(name="id"))
    public class Author extends Authority {
    
        @Column(name = "firstName")
        protected String firstName;
        @Column(name = "lastName")
        protected String lastName;
        @Column(name = "alias")
        protected String alias;
        (...)
    

    }

    【讨论】:

    • 也没有用,但我不确定我做对了。重写是在 Author 类中完成的,对吧?
    • 这样试过了,没用,仍然在权威中插入一个空值。 (但感谢你,我学会了 AttributeOverride :))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多