Java 如何在Hibernate中插入复合主键

Java 如何在Hibernate中插入复合主键,java,hibernate,exception,composite-primary-key,Java,Hibernate,Exception,Composite Primary Key,我在使用Hibernate+hsqldb的java应用程序时遇到了一些问题。 我使用Hibernate.cfg.xml配置了Hibernate,并使用Intellij Idea的“生成持久性映射”功能为它们生成了所有POJO和映射 这些是生成的文件: POJO: User.java public class User { private int id; private String name; private String lastname; private St

我在使用Hibernate+hsqldb的java应用程序时遇到了一些问题。 我使用Hibernate.cfg.xml配置了Hibernate,并使用Intellij Idea的“生成持久性映射”功能为它们生成了所有POJO和映射

这些是生成的文件:

POJO:

User.java

public class User {
    private int id;
    private String name;
    private String lastname;
    private String patronym;
    private Date birthdate;
    private String email;
    private String password;
    private Set<Disk> disks;
    private Set<Takenitem> takenDisks;

   //setters, getters and constructors;
}

Takenitem.java

public class Takenitem {
    private int iddisk;
    private int iduser;
    private User tempUser;
    private Disk disk;

    //setters, getters and constructors;
}

java(复合id类)


映射:

User.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.dvdexchange.User" table="USER" schema="PUBLIC" catalog="PUBLIC">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" column="NAME"/>
        <property name="lastname" column="LASTNAME"/>
        <property name="patronym" column="PATRONYM"/>
        <property name="birthdate" column="BIRTHDATE"/>
        <property name="email" column="EMAIL"/>
        <property name="password" column="PASSWORD"/>
        <set name="disks" inverse="true">
            <key>
                <column name="IDHOST"/>
            </key>
            <one-to-many not-found="ignore" class="com.dvdexchange.Disk"/>
        </set>
        <set name="takenDisks" inverse="true">
            <key>
                <column name="IDUSER"/>
            </key>
            <one-to-many not-found="ignore" class="com.dvdexchange.Takenitem"/>
        </set>
    </class>
</hibernate-mapping>

TakenItemDAOHibernateImpl.java(.addfollowing())

当我运行程序时,出现以下异常:

Hibernate: select this_.ID as ID1_2_0_, this_.NAME as NAME2_2_0_, this_.LASTNAME as LASTNAME3_2_0_, this_.PATRONYM as PATRONYM4_2_0_, this_.BIRTHDATE as BIRTHDAT5_2_0_, this_.EMAIL as EMAIL6_2_0_, this_.PASSWORD as PASSWORD7_2_0_ from PUBLIC.USER this_ where this_.ID=?
Hibernate: select this_.ID as ID1_0_0_, this_.NAME as NAME2_0_0_, this_.IDHOST as IDHOST3_0_0_ from PUBLIC.DISK this_ where this_.ID=?
Hibernate: insert into PUBLIC.TAKENITEM (disk, IDDISK, IDUSER) values (?, ?, ?)
мар 01, 2016 6:02:38 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: -5501, SQLState: 42501
мар 01, 2016 6:02:38 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: user lacks privilege or object not found: DISK
мар 01, 2016 6:02:38 PM org.hibernate.internal.SessionImpl$5 mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [could not prepare statement]
org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:78)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.buildBatchStatement(AbstractBatchImpl.java:136)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.getBatchStatement(AbstractBatchImpl.java:125)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2902)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
    at com.dvdexchange.dao.impl.TakenItemDAOHibernateImpl.addBorrowing(TakenItemDAOHibernateImpl.java:31)
    at com.dvdexchange.main.Main.main(Main.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: DISK
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:87)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
    ... 26 more
Hibernate:选择此用户ID为ID1\u 2\u 0,此用户名称为NAME2\u 0,此用户LASTNAME为LASTNAME3\u 2\u 0,此用户ID为用户4\u 2\u 0,此用户生日为生日5\u 2\u 0,此电子邮件为EMAIL6\u 2\u 0,此密码为密码7\u 2\u 0?
Hibernate:从PUBLIC.DISK this_u中选择此.ID作为ID1\u 0\u,此\uu.NAME作为NAME2\u 0\u,此\uu.IDHOST作为IDHOST3\u 0\uu?
Hibernate:插入PUBLIC.TAKENITEM(磁盘、IDDISK、IDUSER)值(?,?)
2016年6月1日下午6:02:38 org.hibernate.engine.jdbc.spi.SqlExceptionHelper日志异常
警告:SQL错误:-5501,SQLState:42501
2016年6月1日下午6:02:38 org.hibernate.engine.jdbc.spi.SqlExceptionHelper日志异常
错误:用户缺少权限或找不到对象:磁盘
2016年1月1日下午6:02:38 org.hibernate.internal.SessionImpl$5 mapManagedFlushFailure
错误:HH000346:托管刷新期间出错[无法准备语句]
org.hibernate.exception.sqlgrammareexception:无法准备语句
位于org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
位于org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
位于org.hibernate.engine.jdbc.internal.StatementPrepareImpl$StatementPreparationTemplate.prepareStatement(statementPrepareImpl.java:182)
位于org.hibernate.engine.jdbc.internal.StatementPrepareImpl.prepareStatement(statementPrepareImpl.java:78)
位于org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.buildBatchStatement(AbstractBatchImpl.java:136)
位于org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.getBatchStatement(AbstractBatchImpl.java:125)
位于org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2902)
位于org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421)
位于org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
位于org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
位于org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
位于org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295)
位于org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468)
在org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135)上
在org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352)上
在org.hibernate.engine.jdbc.internal.jdbcoordinatorimpl.beforeTransactionCompletion(jdbcoordinatorimpl.java:485)上
在org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(jdbResourceLocalTransactionCoordinatorImpl.java:147)上
位于org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl.access$100(jdbResourceLocalTransactionCoordinatorImpl.java:38)
位于org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(jdbResourceLocalTransactionCoordinatorImpl.java:231)
位于org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
在com.dvdexchange.dao.impl.TakenItemDAOHibernateImpl.addbrinking(TakenItemDAOHibernateImpl.java:31)
位于com.dvdexchange.main.main.main(main.java:32)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
原因:java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:磁盘
位于org.hsqldb.jdbc.jdbcuti.sqlException(未知源)
位于org.hsqldb.jdbc.jdbcuti.sqlException(未知源)
位于org.hsqldb.jdbc.JDBCPreparedStatement。(来源未知)
位于org.hsqldb.jdbc.JDBCConnection.prepareStatement(未知源)
位于org.hibernate.engine.jdbc.internal.StatementPrepareImpl$1.doPrepare(statementPrepareImpl.java:87)
位于org.hibernate.engine.jdbc.internal.StatementPrepareImpl$StatementPreparationTemplate.prepareStatement(statementPrepareImpl.java:172)
... 26多

查看SQL日志,出现以下消息:
错误:用户缺少权限或找不到对象:磁盘

我怎样才能解决它?为什么我不工作。请帮帮我


提前谢谢

未找到对象的原因是在hsqldb中将列定义为区分大小写。

我应该更改什么?实际上,表“takenitem”只有iddisk和iduser列。那怎么了?注意我的eddited方法代码,确保所有列名和表名都在*.hbm中引用。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.dvdexchange.User" table="USER" schema="PUBLIC" catalog="PUBLIC">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" column="NAME"/>
        <property name="lastname" column="LASTNAME"/>
        <property name="patronym" column="PATRONYM"/>
        <property name="birthdate" column="BIRTHDATE"/>
        <property name="email" column="EMAIL"/>
        <property name="password" column="PASSWORD"/>
        <set name="disks" inverse="true">
            <key>
                <column name="IDHOST"/>
            </key>
            <one-to-many not-found="ignore" class="com.dvdexchange.Disk"/>
        </set>
        <set name="takenDisks" inverse="true">
            <key>
                <column name="IDUSER"/>
            </key>
            <one-to-many not-found="ignore" class="com.dvdexchange.Takenitem"/>
        </set>
    </class>
</hibernate-mapping>
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.dvdexchange.Disk" table="DISK" schema="PUBLIC" catalog="PUBLIC">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" column="NAME"/>
        <many-to-one name="host" class="com.dvdexchange.User">
            <column name="IDHOST"/>
        </many-to-one>
    </class>
</hibernate-mapping>
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.dvdexchange.Takenitem" table="TAKENITEM" schema="PUBLIC" catalog="PUBLIC">
        <composite-id mapped="true" class="com.dvdexchange.TakenitemPK">
            <key-property name="iddisk" column="IDDISK"/>
            <key-property name="iduser" column="IDUSER"/>
        </composite-id>
        <many-to-one name="tempUser" class="com.dvdexchange.User" insert="false" update="false">
            <column name="IDUSER"/>
        </many-to-one>
        <many-to-one name="disk" class="com.dvdexchange.Disk"/>
    </class>
</hibernate-mapping>
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        UserDAO userDAO = new UserDAOHibernateImpl();
        DiskDAO diskDAO = new DiskDAOHibernateImpl();
        TakenItemDAO takenItemDAO = new TakenItemDAOHibernateImpl();
        System.out.println("Application started:");

        takenItemDAO.addBorrowing(1, 24);
    }
}
public void addBorrowing(int iduser, int iddisk) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try{
            tx = session.beginTransaction();
            Criteria crTempUser = session.createCriteria(User.class);
            crTempUser.add(Restrictions.eq("id", iduser));
            User tempUser = (User) crTempUser.uniqueResult();

            Criteria crBorrowedDisk = session.createCriteria(Disk.class);
            crBorrowedDisk.add(Restrictions.eq("id", iddisk));
            Disk borrowedDisk = (Disk) crBorrowedDisk.uniqueResult();

            Takenitem takenitem = new Takenitem(iduser, iddisk, tempUser, borrowedDisk);
            session.save(takenitem);
            tx.commit();
        }catch (HibernateException e) {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
Hibernate: select this_.ID as ID1_2_0_, this_.NAME as NAME2_2_0_, this_.LASTNAME as LASTNAME3_2_0_, this_.PATRONYM as PATRONYM4_2_0_, this_.BIRTHDATE as BIRTHDAT5_2_0_, this_.EMAIL as EMAIL6_2_0_, this_.PASSWORD as PASSWORD7_2_0_ from PUBLIC.USER this_ where this_.ID=?
Hibernate: select this_.ID as ID1_0_0_, this_.NAME as NAME2_0_0_, this_.IDHOST as IDHOST3_0_0_ from PUBLIC.DISK this_ where this_.ID=?
Hibernate: insert into PUBLIC.TAKENITEM (disk, IDDISK, IDUSER) values (?, ?, ?)
мар 01, 2016 6:02:38 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: -5501, SQLState: 42501
мар 01, 2016 6:02:38 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: user lacks privilege or object not found: DISK
мар 01, 2016 6:02:38 PM org.hibernate.internal.SessionImpl$5 mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [could not prepare statement]
org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:78)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.buildBatchStatement(AbstractBatchImpl.java:136)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.getBatchStatement(AbstractBatchImpl.java:125)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2902)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
    at com.dvdexchange.dao.impl.TakenItemDAOHibernateImpl.addBorrowing(TakenItemDAOHibernateImpl.java:31)
    at com.dvdexchange.main.Main.main(Main.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: DISK
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:87)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
    ... 26 more